Запись 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. Предупреждение о том, что тег не поддерживается, исчез, но результирующее видео по-прежнему не читается.
Ответы
Ответ 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.