Проблема со скоростью кодирования ffmpeg - PullRequest
1 голос
/ 02 мая 2011

В настоящее время я занимаюсь разработкой приложения, которое делает захват видео с веб-камеры в Linux с использованием инструмента Qt Designer и библиотек V4L2 и ffmpeg под C ++, для захвата изображения нет проблем с использованием lib V4L2, а поскольку это изображениеготов, я посылаю его кодировщику, который основан на библиотеках ffmpeg, первоначально кодировщик создает видеофайл, и он получает изображения для кодирования его в этом файле, моя проблема заключается в следующем: кодирование обычно выполняется, но после того, как яначать воспроизведение записанного видеофайла, скорость кажется увеличенной по сравнению с обычной скоростью!Так что ясно, проблема в кодировании видео, мой вопрос в том, есть ли метод или функция, которая управляет скоростью кодирования изображений ffmpeg ?????спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 15 сентября 2011

При создании пользовательского закодированного видео с помощью FFMpeg вам фактически потребуется установить PTS для каждого AVPacket, который записывается в выходной файл.Установка time_base вашего AVCodecContext только скажет контейнеру, чего ожидать.PTS (отметка времени презентации) сообщает декодеру (при просмотре видео), когда на самом деле отображать этот конкретный кадр.

Например:

У меня есть AVFrame, который я получил от V4L2часть FFMpeg.Для начала безопаснее сделать копию этого изображения с помощью av_picture_copy.(Таким образом, кодировщик не просматривает всю дополнительную информацию в структуре AVFrame.)

av_picture_copy( (AVPicture*) picture, (AVPicture*) pFrame, c->pix_fmt, c->width, c->height );

picture->pts = numFrames;

теперь задает количество точек на основе количества кодированных кадров

pDestFrame->pts = numFrames;

теперь кодирует

numEncodedBytes = avcodec_encode_video( AVCodecCtx, buffer, bufferSize, pDestFrame );

СЕЙЧАС Создайте AVPacket и снова установите метку времени после перемасштабирования

AVPacket pkt;
av_init_packet(&pkt);

pkt.pts = av_rescale_q( c->coded_frame->pts, c->time_base, mpVideoStr->time_base );

if ( c->coded_frame->key_frame ) pkt.flags |= AV_PKT_FLAG_KEY;

pkt.stream_index = mpVideoStr->index;
pkt.data = outbuf;
pkt.size = out_size;

Наконец, вы можете записать пакет

av_write_frame( formatCtx, &pkt );

Я знаю, что это работает дляКодирование видео H264, но я не уверен на 100%, что оно работает для других типов видео, так как я писал о H264, только когда писал это.

0 голосов
/ 02 мая 2011

При создании файла ffmpeg вы должны указать частоту кадров зависит от того, какую библиотеку вы используете, но ищите что-то вроде

pCodecContext->time_base.den = frames_per_second;
pCodecContext->time_base.num = 1;

В противном случае, если вы генерируете 10-15 кадров в секунду с веб-камеры, но по умолчанию в файле установлено значение 30 кадров в секунду, оно будет воспроизводиться с высокой скоростью.

Смотрите http://code.google.com/p/qtffmpegwrapper/ для обёртки Qt ffmpeg

0 голосов
/ 02 мая 2011

Я думаю, вам нужно добавить метки времени к вашим фотографиям.
FFMpeg выполнит кодирование / декодирование максимально быстро. Вы должны написать синхронизацию самостоятельно. Обычно при декодировании и воспроизведении видео у вас есть временные метки, прикрепленные к вашим кадрам, или, по крайней мере, вы можете создавать метки со звуковыми часами и частотой кадров.
Но это сильно зависит от того, как вы хотите синхронизировать и как вы это реализовали.
Может быть, учебник из FFMpeg даст вам несколько советов

...