обработка файлов с dvr falcon eye fe-004H-KIT (ДАЧА) в fedora 30

Jul 24, 2019 03:32

Обработка видео c dvr в linux:

Ман на ffmpeg очень большой и требует понимания большого количества информации о кодеках и формате video файлов.
В двух словах - в формате видео есть контейнеры, которые содержат видеопотоки, которые содержат пакеты и в них фреймы.
Для контейнеров нужны кодеки. У видео есть разрешение и frame rate.
Вот вкратце и всё что я знаю о видео на данный момент. :)

Неплохое howto на хабре: https://habr.com/en/post/333664/

Хранить и просматривать все пол терабайта видео или конвертировать его полностью мне не нужно,
поэтому сразу говорю, что на эффективность и frame drop мне в данном howto плевать - речь идёт о том,
чтобы научиться резать файлы и вытащить из них пару тройку фоток 4х летней давности не прибегая к софту под windows -
более бестолкового времяпрепровождения чем искать к программам волшебный ключ я не знаю - через год-два информация
устареет и станет никому не нужной и уж тем более не нужной линуксоводу. )
О какой либо синхронизации звука и видео речи нет - к моему dvr микрофон не подключался, а нет
микрофона - нет и аудиопотока.

Всё это можно скормить ffmpeg через командную строку, но уж больно много там опций, да и ман академичен.
Правда в irc на freenode есть канал про ffmpeg.

Не зная ничего о видеокодеках задача написать софт за который не стыдно или хотя бы скрипт для разбора контейнера становится неподъёмной когда на всё про всё есть два-три дня.
В результате проще всего найти софт который уже умеет это.
В линухе это ffmpeg с библиотеками и некоторое количество GUI программ интерфейсов к его библиотекам или самой утилите ffmpeg. Есть ещё libav-что-то-там, но мне друзья рекомендовали ffmpeg, так что от него и решил плясать.

Для отладки прогнал по полному файлу ffprobe с опцией максимального журналирования ошибок:

ffprobe -i ./${dvr_source_stream_file} -hide_banner -show_log 32 \
-show_entries packet=pts_time,duration_time,stream_index \
2>./error-log >ffprobe-output

из файлов ffprobe-output и error-log (grep -iv stream 0|wc -l) выяснилось, что поток имеется только один (нулевой) - свободная библиотека-кодек от cisco для h264, которую ставят в линухи не поддерживает data partitioning который используется в моём dvr для файлов h264.
Поэтому надежда просто раскидать один поток пофреймово на 4 была зарублена как бесперспективная - 4 камеры,
один поток и наполнение событийное - нет на одной камере тревоги - не пишем, поэтому надежды получить с
некоторым интервалом кадры только одной из камер глупы - периода у записи с той или иной камеры просто нет. Минута.
Потом несколько секунд. Потом 30 секунд. Разбираться надо держа в уме значения параметров потока.

Попытки отрезать первые 64..128 килобайт данных для этого dvr были лишними.

Нижеследущее написано про fedora 30:

QWiinFF (GUI к ffmpeg) файл в mp4 сконвертировал.
Там правда интерфейс неочевидный - пишет про 100% done имея ввиду что done добавление файла.
Open (+) -> Files to be converted -> convert to: MPEG 4 -> Preset: MPEG 4 auto.
После этого стало возможным запустить собственно конвертирование и спустя несколько минут Done сменилось на Finished.
Сконвертированный файл уже нормально воспринимается медиа плеером mpv:

[olli@dell15 2dig]$ mpv 20140905_170000_ps.mp4
Playing: 20140905_170000_ps.mp4
(+) Video --vid=1 (*) (h264 352x288 25.000fps)
VO: [gpu] 352x288 yuv420p
(Paused) V: 00:12:05 / 04:00:41 (5%)

И вот теперь, зная fps (frame per second), разрешение и имея корректно прописанное поле кодека в новом mp4 файле можно было бы воспользоваться кнопкой Edit справа от Preset, чтобы вырезать из огромного mp4 несколько минут на память. Правда тоже не вышло с первого раза - новый файл не воспринимался тем же обрезальщиком, который его сделал - опять комбинация опций (галочек и радио кнопок) не та. %) Однако с новым файлом уже можно работать с помощью ffmpeg с минимумом ошибок:


dvr_source_stream=20140905_170000_ps.mp4
destination_stream=video.head.h264
fmpeg -t 00:59:59 -i ./${dvr_source_stream} -codec:v h264 -copyts -start_at_zero -map 0:v -r 25 -vsync cfr ${destination_stream}
echo "Result (size): `du -sh ${destination_stream}`"

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from './20140905_170000_ps.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.20.100
Duration: 04:00:41.92, start: 0.040000, bitrate: 470 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 352x288, 468 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
File 'video.head.h264' already exists. Overwrite ? [y/N] y
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x5595c62e9dc0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x5595c62e9dc0] profile High, level 1.3, 4:2:0, 8-bit

mpv отругался на обрезанный кусочек, ну чтож - надо разбираться со всеми опциями командной строки, а у меня нет времени. Главное первый отрезок длинной в час есть.

Result (size): 196M video.head.h264
[olli@dell15 2dig]$ mpv video.head.h264
Playing: video.head.h264
[lavf] This format is marked by FFmpeg as having no timestamps!
[lavf] FFmpeg will likely make up its own broken timestamps. For
[lavf] video streams you can correct this with:
[lavf] --no-correct-pts --fps=VALUE
[lavf] with VALUE being the real framerate of the stream. You can
[lavf] expect seeking and buffering estimation to be generally
[lavf] broken as well.
(+) Video --vid=1 (h264 352x288 25.000fps)
No video PTS! Making something up. Using 25.000000 FPS.
VO: [gpu] 352x288 yuv420p
V: 00:00:00 / unknown (0%)
No video PTS! Making something up. Using 25.000000 FPS.
Ignoring further missing PTS warnings.
V: 00:02:25 / unknown (3%) Dropped: 1

Exiting... (Quit)
[olli@dell15 2dig]$

вацап поддерживает .mp4 файлы:
ffmpeg -c:v h264 -i video.head.h264 video.head.mp4

Продолжение в других постах с тегом dvr если вернусь к этой теме. %)

url, video surveillance, fedora, dvr, 2update, howto

Previous post Next post
Up