Подтвердить что ты не робот

Запись x264 из OpenCV 3 с помощью FFmpeg в Linux

У меня возникли проблемы с записью видео h264 с OpenCV 3 через FFmpeg ( "X", "2", "6", "4" "FOURCC" ). Я видел все связанные записи на SO, но ничего не помогает. Код:

cv::VideoWriter writer(output_path.string(),    CV_FOURCC('X','2','6','4'), 60, frame_size);

Вывод:

OpenCV: FFMPEG: тег 0x34363258/'X264' не поддерживается идентификатором кодека 28 и формат "mp4/MP4 (MPEG-4 часть 14)" OpenCV: FFMPEG: отключение к использовать тег 0x00000021/'!???'

Результирующее видео чрезвычайно мало (байт) и нечитабельно. Установка four_cc на -1 приводит к "неизвестному тегу" из FFmpeg, я не получаю никаких подсказок, чтобы выбрать кодек, как предложили другие.

В документе OpenCV 3 указывается:

Бэкэнд FFMPEG с контейнером MP4 изначально использует другие значения как fourcc код: см. ObjectType, чтобы вы могли получать предупреждающее сообщение от OpenCV о преобразовании кода в четыре капли.

В этой статье они не указаны h264/x264, и я не уверен, как интерпретировать этот оператор, поскольку ранее сообщения SO отображаются во всем списке X.2.6.4 в качестве соответствующего кода. Использование H.2.6.4 фактически дает идентичный результат.

Любые предложения/обходные пути?

P.S. ffmpeg является самым последним из поддерживающих Ubuntu, он перечисляет, что он был настроен с помощью --enable-libx264

EDIT: Я попытался использовать контейнер mkv вместо mp4. Предупреждение о том, что тег не поддерживается, исчез, но результирующее видео по-прежнему не читается.

4b9b3361

Ответ 1

Проблема не имеет ничего общего с отображаемым предупреждением. Я пытался писать одноканальные изображения, в то время как VideoWriter ожидал трехканального цветного изображения (значение по умолчанию isColor, 5-го аргумента для конструктора VideoWriter, является "истинным" ). Решение установило isColor на false.

Ответ 2

Я думаю, что ваше открытие здесь ключевое:

Бэкэнд FFMPEG с контейнером MP4 изначально использует другие значения в виде кода 4cc: см. ObjectType, поэтому вы можете получить предупреждение от OpenCV о преобразовании кода 4cc.

Значения тега mp4, реализованные для ffmpeg, подтверждают это и находятся в ff_mp4_obj_type[], в isom.c. Для поддержки этого кода необходимо обновить код в OpenCV cap_ffmpeg_impl.hpp. Я просидел около часа или два, понял, что это нетривиально и залог.

Один рабочий процесс - вывод в файл .avi. Существует множество примеров того, что люди сталкиваются с проблемами с OpenCV и mp4, и им говорят использовать .mov или .avi. (Здесь один.)

@Greg Kramida: настройка isColor = false не помогла мне: сообщение осталось, и мой выходной файл стал всего ~ 48 байт. Согласно документации, это флаг Windows - что бы он ни делал для меня в Linux, это не хорошо.

Вы подтвердили, что можете генерировать x264 с помощью ffmpeg самостоятельно?

После подтверждения того, что libx264 имеет значение 0x21, когда я вызываю это в командной строке:

ffmpeg -i x264-input.mp4 -vcodec libx264 -f mp4 x264-output.mp4

Я решил использовать 0x21 непосредственно в VideoWriter.open(). Это генерирует действительный и интерпретируемый видеофайл.

Для справки, мое программное обеспечение - ffmpeg 3.0:

ffmpeg -version
ffmpeg version 3.0 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.9.2 (Debian 4.9.2-10)
configuration: --enable-libx264 --enable-gpl --prefix=/usr/local --enable-shared --cc=`gcc -fPIC` --enable-libfdk-aac --enable-libx265 --enable-nonfree --enable-libmp3lame
libavutil      55. 17.103 / 55. 17.103
libavcodec     57. 24.102 / 57. 24.102
libavformat    57. 25.100 / 57. 25.100
libavdevice    57.  0.101 / 57.  0.101
libavfilter     6. 31.100 /  6. 31.100
libswscale      4.  0.100 /  4.  0.100
libswresample   2.  0.101 /  2.  0.101
libpostproc    54.  0.100 / 54.  0.100

И OpenCV 3.1.0 настроен на:

cmake \
    -D WITH_IPP=ON \
    -D INSTALL_CREATE_DISTRIB=ON \
    -D CMAKE_BUILD_TYPE=Release \
    -D CMAKE_INSTALL_PREFIX=/usr/local ..

x264 - это релиз libx264-142:amd64 для Debian Jessie.