1

ffmpeg + x264を使用して、一連のjpeg画像からh264にビデオをエンコードしようとしています。次のように 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 && を使用する場合、コーデック コンテキストに必要な設定が他にもあります。

4

1 に答える 1

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
    
  • そして、pogorskiyが言ったように、swscaleを使用してRGB JPG画像をYUV形式に変換する必要があります。

リンクされた例を見てください。私は VC++2010 でテストしました。完全に動作し、RGB char 配列を送信できます。

于 2014-02-21T01:58:08.470 に答える