Надо сконвертировать mjpeg (mp4 файл, где одни jpeg'и). Исходный файл получен с помощью opencv, соотв. он пишет jpeg (mp4v),
т.е. либо минимальное сжатие, либо просто плюхает jpeg фреймы как есть. Судя по всему, h264 opencv не использует из-за лицензии.
Соотв. в пост-проценссинге уменьшаю файл. На данный момент в 20 секунд, 15 fps, имеет размер 50Мб, после этой команды
Здравствуйте, sergey2b, Вы писали:
S>под какой OS вы пишите ? под вин ffmpeg для opencv уже прикомпилированный
Пока под вин, потом ubunta. S>под линук придеться собирать самому тынц
S>можно использовать флаг cv::CAP_FFMPEG при открытии VideoWriter writer; S>есть в примерах к opencv
Ну он там по умолчанию для mp4 файлов.
S>судя повсему аудио у вас нет S>можно писать при помощи ffmpeg тынц
Аудио нету. А в чем смысл этой ссылки и кода? Кстати, я использую обертку на дотнет, возможно будут проблемы.
Возможно вы правы , могу завтра посмотреть исходник opencv
но тогда надо объяснить почему opencv под linux не включает себя ffmpeg который по умолчанию
Здравствуйте, Sharov, Вы писали:
S>т.е. либо минимальное сжатие, либо просто плюхает jpeg фреймы как есть. Судя по всему, h264 opencv не использует из-за лицензии.
Чтобы OpenCV мог h.264 под Windows, надо ему подложить openh264-1.8.0-win64.dll. Просто найти собранную, скачать и подложить рядом. Туда же opencv_ffmpeg*.dll, которая скачивается, когда делаешь cmake configure
Здравствуйте, sergey2b, Вы писали:
S>Возможно вы правы , могу завтра посмотреть исходник opencv S>но тогда надо объяснить почему opencv под linux не включает себя ffmpeg который по умолчанию
Я всегда сам собираю себе OpenCV и сам руками включаю поддержку ffmpeg и gstreamer.
Здравствуйте, Nuzhny, Вы писали:
N>Чтобы OpenCV мог h.264 под Windows, надо ему подложить openh264-1.8.0-win64.dll. Просто найти собранную, скачать и подложить рядом. Туда же opencv_ffmpeg*.dll, которая скачивается, когда делаешь cmake configure
Что-то не получается, по итогу файл 0 длины. Содержимое папки x64:
openh264-2.4.0-win64.dll
OpenCvSharpExtern.dll
opencv_videoio_ffmpeg490_64.dll
Часть вывода Cv2.GetBuildInformation():
Video I/O:
DC1394: NO
FFMPEG: YES (prebuilt binaries)
avcodec: YES (58.134.100)
avformat: YES (58.76.100)
avutil: YES (56.70.100)
swscale: YES (5.9.100)
avresample: YES (4.0.0)
GStreamer: NO
DirectShow: YES
Media Foundation: YES
DXVA: YES
Пробовал как тут-- безрезультатно.
На SO где-то читал, что без специальной пересборки ffmpeg h264 не взлетит.
Здравствуйте, sergey2b, Вы писали:
S>Возможно вы правы , могу завтра посмотреть исходник opencv S>но тогда надо объяснить почему opencv под linux не включает себя ffmpeg который по умолчанию
Вероятно, что бы был выбор между gst и ffmpeg. Там проблемы с проприетарным h264.
Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, Nuzhny, Вы писали:
N>>Чтобы OpenCV мог h.264 под Windows, надо ему подложить openh264-1.8.0-win64.dll. Просто найти собранную, скачать и подложить рядом. Туда же opencv_ffmpeg*.dll, которая скачивается, когда делаешь cmake configure
S>Что-то не получается, по итогу файл 0 длины. Содержимое папки x64:
Заметил в логах ошибку: [libopenh264 @ 000001db50aca840] Incorrect library version loaded
Может действительно надо 1.8.0 брать...
Update: не взлетело, также не может подгрузить . Очевидно надо как-то версии подбирать.
Пока не понимаю, как понять какую версию ffmpeg OpenCV использует. Может в этом дело?
OpenCV 4.9.0. https://opencv.org/releases/ -- тут ничего не нашел.
Здравствуйте, Sharov, Вы писали:
S>Заметил в логах ошибку: [libopenh264 @ 000001db50aca840] Incorrect library version loaded S>Может действительно надо 1.8.0 брать...
AD>Версия, с которой был собран ffmpeg, лежит как статик переменная g_stCodecVersion внутри ffmpeg в libavcodec/libopenh264.c AD>Т.к. она статик, то наверное до нее не добраться без дебаг инфы... AD>https://github.com/cisco/openh264/blob/master/codec/api/wels/codec_ver.h AD>Но может каким-то образом в dll остался текстовый вариант. Можно поискать "OpenH264 version".
Как понять какую версию ffmpeg ocv использует?
Выше список файлов.
Здравствуйте, sergey2b, Вы писали:
S>оно точно работает с предкомпилированным ffmpeg S>я могу выложить если у вас есть куда
Там с openh264 проблема. Подкладывать надо точно ту версию, с которой собирали сам ffmpeg. Надо либо у источника выяснить, либо перебором... Ну или самому всё пересобрать.
Здравствуйте, andrey.desman, Вы писали:
AD>Здравствуйте, Sharov, Вы писали: S>>Как понять какую версию ffmpeg ocv использует? S>>Выше список файлов. AD>https://ffmpeg.org/download.html AD>avcodec: YES (58.134.100) -> ffmpeg 4.4.4
В общем, подгрузить удалось. Действительно требовалась версия 1.8.0, как выше Сергей указал. Я положил все 3 файла рядом (см. выше),
но оказалось, что на венде надо делать отдельную переменную окружения -- тыц.
Добил, больше не ругается, даже чего-то такое пишет (см. ниже), но все равно почему-то не работает и используется avc1, что по итогу долго и
дает файл больше 1.5 раза, а должен в 5 раз меньше и шустро. Лог ниже. ЧЯДНТ?
[ WARN:0@0.840] global cap.cpp:606 cv::VideoWriter::open VIDEOIO(FFMPEG): trying writer with filename='d:\out.mp4' fourcc=0x34363258 fps=15.0497 sz=3840x1245 isColor=1...
[DEBUG:0@0.664] global cap_ffmpeg_impl.hpp:2882 open Selected pixel format: bgr24 OpenCV: FFMPEG: tag 0x34363258/'X264' is not supported with codec id 27 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x31637661/'avc1'
[DEBUG:0@0.673] global cap_ffmpeg_hw.hpp:934 HWAccelIterator FFMPEG: allowed acceleration types (none): ''
OpenH264 Video Codec provided by Cisco Systems, Inc.
[ WARN:0@0.858] global cap.cpp:619 cv::VideoWriter::open VIDEOIO(FFMPEG): created, isOpened=1
Код:
_videoWriter = new VideoWriter(outputFile,FourCC.H264, fps, size); //с X264 также не работает.