我正在使用FFMPEG对视频进行编码,我为数据包设置了绿屏,我认为这意味着我将获得空缓冲区。我怀疑我传递参数错误。我想帮助正确传递参数。
vpx_codec_iter_t iter = NULL;
const vpx_codec_cx_pkt_t *pkt;
// copy the pixels into our "raw input" container.
int bytes_filled = avpicture_fill(&pic_raw, data, AV_PIX_FMT_YUV420P, out_width, out_height);
if(!bytes_filled) {
Logger::Log("Cannot fill the raw input buffer");
return;
}
if(vpx_codec_encode(&codec, &raw, frame_cnt, 1, flags, VPX_DL_REALTIME))
die_codec(&codec, "Failed to encode frame");
while( (pkt = vpx_codec_get_cx_data(&codec, &iter)) ) {
switch(pkt->kind) {
case VPX_CODEC_CX_FRAME_PKT:
glb_app_thread.message_loop().PostWork(callback_factory_.NewCallback(&EncoderInstance::write_ivf_frame_header, pkt));
glb_app_thread.message_loop().PostWork(callback_factory_.NewCallback(&EncoderInstance::WriteFile, pkt));
break;
default:break;
}
}
用于事件处理程序
void EncoderInstance::WriteFile(int32_t result, const vpx_codec_cx_pkt_t *pkt){
lock_file_.Acquire();
(void) fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz, outfile);
Logger::Log("Packet written");
lock_file_.Release();
}
我的问题是,我是否正确地传递了pkt
这个论点?或者我应该将这些数据包放入队列,然后让writeFile
函数在队列上工作。