Как правильно использовать пример кода использования OpenH264 для кодирования?

У меня есть изображение, и я хочу закодировать его OpenH264.

Пока это код, который я получил от их вики:

#include <fstream>
#include <iterator>

#include <iostream>
#include <codec_api.h> //standard api for openh264

//additional libaries used by sample code
#include <codec_app_def.h>
#include <codec_def.h>
#include <codec_ver.h>
#include <assert.h>
#include <vector>
#include <cstring>
int main()
{
//parameter values
int width = 1920;
int height = 1080;
int framerate = 60;
int bitrate = 5000000;
int total_num = 500; //what does this value do?
//end parameter values

//Read in the File from bmp
std::vector<char> buf; //to store the image information

std::basic_ifstream<char> file("/home/megamol/Git/h264_sample/build/test.bmp", std::ios::binary); //opens bitstream to source
buf = std::vector<char>((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); // reads in data to the vector

std::cout << "sizeof buf: " << buf.size() << std::endl;

//Step 1: set up Encoder

ISVCEncoder* encoder_;    //declaration of encoder pointer
int rv = WelsCreateSVCEncoder (&encoder_);

//Step 2: initialize with basic parameter

SEncParamBase param;
memset(&param, 0, sizeof (SEncParamBase));
param.iUsageType = EUsageType::SCREEN_CONTENT_REAL_TIME;
param.fMaxFrameRate = framerate;
param.iPicWidth = width;
param.iPicHeight = height;
param.iTargetBitrate = bitrate; //default value of example
encoder_->Initialize(&param);

//Step 3: set video format

int videoFormat = videoFormatI420;
encoder_->SetOption (ENCODER_OPTION_DATAFORMAT, &videoFormat);

//Step 4: encocode and store output bitstream
int frameSize = width * height * 3 / 2;
buf.resize(frameSize);

SFrameBSInfo info;
std::vector<char> compressedData;

memset (&info, 0, sizeof (SFrameBSInfo));
SSourcePicture pic;
memset (&pic, 0, sizeof (SSourcePicture));
pic.iPicWidth = width;
pic.iPicHeight = height;
pic.iColorFormat = videoFormatI420;
pic.iStride[0] = pic.iPicWidth;
pic.iStride[1] = pic.iStride[2] = pic.iPicWidth >> 1;
pic.pData[0] = reinterpret_cast<unsigned char*>(&buf[0]);
pic.pData[1] = pic.pData[0] + width * height;
pic.pData[2] = pic.pData[1] + (width * height >> 2);

//encodes the frame
rv = encoder_->EncodeFrame (&pic, &info); // encodes the Frame
//encoding done encoded Frame should be stored in &info

//begin decoding block
ISVCDecoder *pSvcDecoder;
unsigned char *pBuf= &info;

return 0;
}

Я не совсем уверен, является ли это правильным использованием OpenH264, но я также не уверен, как правильно его протестировать.

Теперь пример кода плохо документирован.

Что такое BufferedData buf; например? Я понимаю, что это должен быть вход, но что это за тип? Например, как я могу загрузить свой test.bmp как BufferedData? Я не думаю, что я делаю это правильно еще.

Еще одна вещь, которая меня сильно смущает, — как мне получить доступ к выводу после кодирования? В примере это просто говорит //output bitstream и ничего о сохранении этого вывода в любом месте. Я думал, что результат был info как говорится в codec_api.h заголовочный файл:

  /**
* @brief Encode one frame
* @param kpSrcPic the pointer to the source luminance plane
*        chrominance data:
*        CbData = kpSrc  +  m_iMaxPicWidth * m_iMaxPicHeight;
*        CrData = CbData + (m_iMaxPicWidth * m_iMaxPicHeight)/4;
*        the application calling this interface needs to ensure the data validation between the location
* @param pBsInfo output bit stream
* @return  0 - success; otherwise -failed;
*/
virtual int EXTAPI EncodeFrame (const SSourcePicture* kpSrcPic, SFrameBSInfo* pBsInfo) = 0;

Но, видимо, он только сохраняет информацию о выходе. Я просто очень запутался во всем этом.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]