Я пытаюсь тонно кодировать видео из набора изображений 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 &&
Без полной версии вашего кода трудно понять, в чем проблема.
Во-первых, вот рабочий пример библиотеки 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.
Других решений пока нет …