ffmpeg из mjpeg в mp4 долго отрабатывает.
От: Sharov Россия  
Дата: 29.01.24 20:26
Оценка:
Здравствуйте.

Надо сконвертировать mjpeg (mp4 файл, где одни jpeg'и). Исходный файл получен с помощью opencv, соотв. он пишет jpeg (mp4v),
т.е. либо минимальное сжатие, либо просто плюхает jpeg фреймы как есть. Судя по всему, h264 opencv не использует из-за лицензии.
Соотв. в пост-проценссинге уменьшаю файл. На данный момент в 20 секунд, 15 fps, имеет размер 50Мб, после этой команды

ffmpeg -i source_file.mp4 -pix_fmt yuv420p -b:v 2000k -c:v libx264 destination_file.mp4

файл уменьшается раз в 5, но очень долго, ~ 20 секунд.

Можно ли это как-то ускорить, т.е. команду выше? Или это норма?

Заранее благодарю.
Кодом людям нужно помогать!
Отредактировано 29.01.2024 20:29 Sharov . Предыдущая версия .
Re: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: andrey.desman  
Дата: 29.01.24 21:57
Оценка: 10 (1)
Здравствуйте, Sharov, Вы писали:

S>Можно ли это как-то ускорить, т.е. команду выше? Или это норма?


https://trac.ffmpeg.org/wiki/Encode/H.264

-preset ultrafast
Re: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: sergey2b ЮАР  
Дата: 29.01.24 22:12
Оценка: 5 (1)
Здравствуйте, Sharov, Вы писали:

S>Можно ли это как-то ускорить, т.е. команду выше? Или это норма?


под какой OS вы пишите ? под вин ffmpeg для opencv уже прикомпилированный
под линук придеться собирать самому тынц

можно использовать флаг cv::CAP_FFMPEG при открытии VideoWriter writer;
есть в примерах к opencv

судя повсему аудио у вас нет
можно писать при помощи ffmpeg тынц
Re[2]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: Sharov Россия  
Дата: 29.01.24 22:39
Оценка:
Здравствуйте, andrey.desman, Вы писали:
S>>Можно ли это как-то ускорить, т.е. команду выше? Или это норма?
AD>https://trac.ffmpeg.org/wiki/Encode/H.264
AD>
AD>-preset ultrafast
AD>


Круто, благодарю. Раз в 5 быстрее (3-5 сек). А за счет чего такая скорость, что мы теряем?
Кодом людям нужно помогать!
Re[2]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: Sharov Россия  
Дата: 29.01.24 22:43
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>под какой OS вы пишите ? под вин ffmpeg для opencv уже прикомпилированный


Пока под вин, потом ubunta.
S>под линук придеться собирать самому тынц

S>можно использовать флаг cv::CAP_FFMPEG при открытии VideoWriter writer;

S>есть в примерах к opencv

Ну он там по умолчанию для mp4 файлов.

S>судя повсему аудио у вас нет

S>можно писать при помощи ffmpeg тынц

Аудио нету. А в чем смысл этой ссылки и кода? Кстати, я использую обертку на дотнет, возможно будут проблемы.
Кодом людям нужно помогать!
Re[3]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: sergey2b ЮАР  
Дата: 29.01.24 22:46
Оценка: 5 (1)
Здравствуйте, Sharov, Вы писали:

S>Аудио нету. А в чем смысл этой ссылки и кода? Кстати, я использую обертку на дотнет, возможно будут проблемы.


это работающий пример как записыать mp4 при помощи avcodec
на которой собран ffmpeg
Re[3]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: sergey2b ЮАР  
Дата: 30.01.24 00:20
Оценка:
Возможно вы правы , могу завтра посмотреть исходник opencv
но тогда надо объяснить почему opencv под linux не включает себя ffmpeg который по умолчанию
Re: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 30.01.24 04:49
Оценка: 1 (1) +1
Здравствуйте, Sharov, Вы писали:

S>т.е. либо минимальное сжатие, либо просто плюхает jpeg фреймы как есть. Судя по всему, h264 opencv не использует из-за лицензии.


Чтобы OpenCV мог h.264 под Windows, надо ему подложить openh264-1.8.0-win64.dll. Просто найти собранную, скачать и подложить рядом. Туда же opencv_ffmpeg*.dll, которая скачивается, когда делаешь cmake configure
Re[4]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 30.01.24 04:50
Оценка: 15 (1)
Здравствуйте, sergey2b, Вы писали:

S>Возможно вы правы , могу завтра посмотреть исходник opencv

S>но тогда надо объяснить почему opencv под linux не включает себя ffmpeg который по умолчанию

Я всегда сам собираю себе OpenCV и сам руками включаю поддержку ffmpeg и gstreamer.
Re[5]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: sergey2b ЮАР  
Дата: 30.01.24 04:53
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Я всегда сам собираю себе OpenCV и сам руками включаю поддержку ffmpeg и gstreamer.


я Тоже
еще можно вклучить поддержку GPU в opencv
Re[2]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: Sharov Россия  
Дата: 30.01.24 09:05
Оценка:
Здравствуйте, 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 не взлетит.
Кодом людям нужно помогать!
Re[4]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: Sharov Россия  
Дата: 30.01.24 09:07
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>Возможно вы правы , могу завтра посмотреть исходник opencv

S>но тогда надо объяснить почему opencv под linux не включает себя ffmpeg который по умолчанию

Вероятно, что бы был выбор между gst и ffmpeg. Там проблемы с проприетарным h264.
Кодом людям нужно помогать!
Re[3]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: Sharov Россия  
Дата: 30.01.24 09:11
Оценка:
Здравствуйте, 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/ -- тут ничего не нашел.
Кодом людям нужно помогать!
Отредактировано 30.01.2024 9:28 Sharov . Предыдущая версия .
Re[3]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: andrey.desman  
Дата: 30.01.24 09:47
Оценка: 5 (1)
Здравствуйте, Sharov, Вы писали:

S>Круто, благодарю. Раз в 5 быстрее (3-5 сек). А за счет чего такая скорость, что мы теряем?


Качество, размер. Но это от контента зависит.
Re[4]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: andrey.desman  
Дата: 30.01.24 10:07
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Заметил в логах ошибку: [libopenh264 @ 000001db50aca840] Incorrect library version loaded

S>Может действительно надо 1.8.0 брать...

Версия, с которой был собран ffmpeg, лежит как статик переменная g_stCodecVersion внутри ffmpeg в libavcodec/libopenh264.c
Т.к. она статик, то наверное до нее не добраться без дебаг инфы...
https://github.com/cisco/openh264/blob/master/codec/api/wels/codec_ver.h

Но может каким-то образом в dll остался текстовый вариант. Можно поискать "OpenH264 version".
Re[5]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: Sharov Россия  
Дата: 30.01.24 11:25
Оценка:
Здравствуйте, andrey.desman, Вы писали:


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 использует?
Выше список файлов.
Кодом людям нужно помогать!
Отредактировано 30.01.2024 11:29 Sharov . Предыдущая версия .
Re[6]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: andrey.desman  
Дата: 30.01.24 13:56
Оценка: 10 (1) +1
Здравствуйте, Sharov, Вы писали:

S>Как понять какую версию ffmpeg ocv использует?

S>Выше список файлов.

https://ffmpeg.org/download.html

avcodec: YES (58.134.100) -> ffmpeg 4.4.4
Re[3]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: sergey2b ЮАР  
Дата: 30.01.24 14:13
Оценка:
Здравствуйте, Sharov, Вы писали:


S>Пробовал как тут-- безрезультатно.

S>На SO где-то читал, что без специальной пересборки ffmpeg h264 не взлетит.

оно точно работает с предкомпилированным ffmpeg
я могу выложить если у вас есть куда
Re[6]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: sergey2b ЮАР  
Дата: 30.01.24 14:15
Оценка:
Здравствуйте, Sharov, Вы писали:


выложите ваш код который читает mp4 и записывает
может там ошибка
Re[4]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: andrey.desman  
Дата: 30.01.24 14:29
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>оно точно работает с предкомпилированным ffmpeg

S>я могу выложить если у вас есть куда

Там с openh264 проблема. Подкладывать надо точно ту версию, с которой собирали сам ffmpeg. Надо либо у источника выяснить, либо перебором... Ну или самому всё пересобрать.
Re[3]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: reversecode google
Дата: 30.01.24 15:05
Оценка: 10 (1)
https://codec.fandom.com/ru/wiki/X264_-_описание_ключей_кодирования

ultrafast (ультра-быстрый):
--no-8x8dct --aq-mode 0 --b-adapt 0 --bframes 0 --no-cabac --no-deblock --no-mbtree --me dia --no-mixed-refs --partitions none --rc-lookahead 0 --ref 1 --scenecut 0 --subme 0 --trellis 0 --no-weightb --weightp 0


это пред настройки
основной груз енкодера на кодирование bframe идет

их bframe не любят и не используют во всяких видео стриминга
где нужно видео прямо сейчас а не потом

зачем они bframe нужны и что теряется, можете почитать отдельно
Re[7]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: Sharov Россия  
Дата: 30.01.24 17:50
Оценка: 15 (1)
Здравствуйте, 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 также не работает.
Кодом людям нужно помогать!
Отредактировано 30.01.2024 17:51 Sharov . Предыдущая версия . Еще …
Отредактировано 30.01.2024 17:50 Sharov . Предыдущая версия .
Re[8]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: sergey2b ЮАР  
Дата: 07.03.24 18:53
Оценка: 8 (1)
Здравствуйте, Sharov, Вы писали:

S>Код:

S>_videoWriter = new VideoWriter(outputFile,FourCC.H264, fps, size); //с X264 также не работает.

я долго не заходил в раздел
для вас вопрос еще актуален ?

если да я постораюсь выложить работающий пример
Re[9]: ffmpeg из mjpeg в mp4 долго отрабатывает.
От: Sharov Россия  
Дата: 07.03.24 19:14
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>я долго не заходил в раздел

S>для вас вопрос еще актуален ?

Вообще решили проблему с помощью gst (opencv + gst).

S>если да я постораюсь выложить работающий пример


Давайте, почему нет?
Кодом людям нужно помогать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.