FFMPEG采用x264编码

时间:2013-01-31 10:31:18

标签: c++ ffmpeg libx264

我正在尝试将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&&

时,我对编解码器上下文有更多必要的设置

1 个答案:

答案 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字符数组。