FFMPEG с кодировкой x264

Я пытаюсь тонно кодировать видео из набора изображений 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

Решение

Без полной версии вашего кода трудно понять, в чем проблема.

Во-первых, вот рабочий пример библиотеки FFMPEG, кодирующей кадры RGB в видео H264:

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
    
  • И тогда вам нужно конвертировать картинку RGB JPG в формат YUV, используя swscale, как сказал Погорский.

Посмотрите на связанный пример, я протестировал его на VC ++ 2010, и он отлично работает, и вы можете отправить ему массив символов RGB.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]