我正在尝试将jpeg图像集中的视频编码为h264,使用ffmpeg + x264。我以这种方式初始化AVCodecContext:
_outputCodec = avcodec_find_encoder(AV_CODEC_ID_H264);
_outputCodecContext = avcodec_alloc_context3(_outputCodec);
avcodec_get_context_defaults3(_outputCodecContext, _outputCodec);
_outputCodecContext->width = _currentWidth;
_outputCodecContext->height = _currentHeight;
_outputCodecContext->pix_fmt = AV_PIX_FMT_YUV420P;
_outputCodecContext->time_base.num = 1;
_outputCodecContext->time_base.den = 25;
_outputCodecContext->profile =FF_PROFILE_H264_BASELINE;
_outputCodecContext->level = 50;
avcodec_open没有返回任何错误,一切正常,但是当我调用avcodec_encode_video2()时,我收到了这样的消息(我认为它来自x264):
using mv_range_thread = %d
%s
profile %s, level %s
然后应用程序崩溃。当使用x264&&
时,我对编解码器上下文有更多必要的设置答案 0 :(得分:1)
如果没有完整版的代码,很难看出实际问题是什么。
首先,这是将RGB帧编码为H264视频的FFMPEG库的工作示例:
http://www.imc-store.com.au/Articles.asp?ID=276
您可以通过使用CImage加载JPG并将RGB数据传递到FFMPEG类以编码为H264视频来扩展此示例。
关于你的例子的几点想法:
您是否在下面调用了注册表?
avcodec_register_all();
av_register_all();
此外,我会重新编写您的代码,如下所示:
AVStream *st;
m_video_codec = avcodec_find_encoder(AV_CODEC_ID_H264);
st = avformat_new_stream(_outputCodec, m_video_codec);
_outputCodecContext = st->codec;
_outputCodecContext->codec_id = m_fmt->video_codec;
_outputCodecContext->bit_rate = m_AVIMOV_BPS; //Bits Per Second
_outputCodecContext->width = m_AVIMOV_WIDTH; //Note Resolution must be a multiple of 2!!
_outputCodecContext->height = m_AVIMOV_HEIGHT; //Note Resolution must be a multiple of 2!!
_outputCodecContext->time_base.den = m_AVIMOV_FPS; //Frames per second
_outputCodecContext->time_base.num = 1;
_outputCodecContext->gop_size = m_AVIMOV_GOB; // Intra frames per x P frames
_outputCodecContext->pix_fmt = AV_PIX_FMT_YUV420P;//Do not change this, H264 needs YUV format not RGB
然后你需要使用swscale将RGB JPG图片转换为YUV格式,正如pogorskiy所说。
看一下链接的例子,我在VC ++ 2010上进行了测试,它运行良好,你可以发送一个RGB字符数组。