以下是我的当前工作代码:
AVOutputFormat *outputFormat = av_guess_format("ffh264", movieFile.toLocal8Bit().data(), nullptr);
if (!outputFormat)
return false;
enum AVCodecID videoCodecID = outputFormat->video_codec;
AVCodec *videoCodec = avcodec_find_encoder(videoCodecID);
if (!videoCodec)
return false;
AVStream *stream = avformat_new_stream(formatContext, videoCodec);
if (!stream)
return false;
AVCodecContext *videoCodecContext = stream->codec; // <- codec is a deprecated parameter
videoCodecContext->width = videoW;
videoCodecContext->height = videoH;
现在,为了替换"codec"参数,libav开发团队建议使用AVStream结构中包含的"codecpar" (AVCodecParameters) 参数。他们分享的示例如下:
if (avcodec_parameters_to_context(videoCodecContext, stream->codecpar) < 0)
return nullptr;
注意:codecpar(AVCodecParameters)本身就是一个数据结构。
不幸的是,当我尝试使用该代码时,出现了这个问题:通常,存储在codecpar参数中的所有信息都来自先前打开的视频文件的数据结构。换句话说,信息已经存在。在我的情况下,情况有所不同,因为我正在从头开始创建一个MP4文件,因此没有以前的codecpar记录可用,因此我必须自己创建一个新的AVCodecParameters结构实例,并手动设置每个变量。
到目前为止,我已经能够设置codecpar结构中的所有变量,除了两个变量:
uint8_t * extradata
int extradata_size
注意:目前我可以在不设置这些变量的情况下“成功”创建MP4文件,但是该文件不完整。当我试图使用“mplayer”播放它时,会出现以下错误消息:
[extract_extradata @ 0x55b5bb7e45c0] No start code is found.
我正在研究这两个领域,它们似乎存储与编解码器相关的某些信息,而在我的情况下是H264。
因此,我的具体问题是:如果我从头开始设置一个
codecpar
变量(AVCodecParameters
),如何以正确的方式设置extradata
和extradata_size
字段的值,以适用于H264编解码器?