Сегмент ffmpeg по времени видео вместо времени стены
1921
studog
У меня есть система, которая записывает видео на диск, и иногда система имеет ошибку. Я пытаюсь воссоздать систему записи в лаборатории без реальной камеры (это дорого и нет никаких запчастей), чтобы попытаться воспроизвести схему использования, которая вызывает ошибку.
У меня проблемы с приручением ffmpeg.
Фон:
Видео непрерывно записывается в один поток с URL-адреса rtsp: //, предоставленного подключенной камерой с помощью этой команды:
Это работает и производит видеофайлы продолжительностью 15 минут, как и ожидалось.
Проблема:
В лаборатории у меня нет ни камеры, ни потока rtsp: //. Вместо этого я скопировал один из MP4 захвата из реальной системы и вместо этого использую его как вход для ffmpeg. Что-то вроде:
-stream_loop -1Параметр делает то, что ожидалось: он считывает из входного файла (который находится в 15 минут по длительности) и производит бесконечный выходной поток. Это разумное приближение чтения из потока rtsp: //.
Что я не могу понять, так это какие параметры использовать, чтобы эта лабораторная система сегментировала видео на куски продолжительностью 15 минут, как это делает реальная система. То, что я ожидаю, является последовательностью выходных файлов, каждый примерно того же размера, что и входной файл.
Попытка № 1
Использование, по- -segment_time 900видимому, либо a) хочет использовать значение настенных часов, равное 15 минутам, либо b) игнорируется. Поскольку копирование из существующего MP4 намного быстрее, чем копирование из потока rtsp: //, результирующий файл захвата представляет собой множество копий оригинала.
Использование -segment_frames 13494, по-видимому, игнорируется, а вывод вообще не сегментируется.
Попытка № 3
Я прочитал кучу документации ffmpeg и мне не хватает того, что мне нужно, или его не существует.
Использование -ss *position* -t *duration*не делает непрерывной записи и сегментации выходных данных.
Запрос о помощи
Какие параметры я должен использовать, чтобы получить сегментацию для a) работы и b) продолжительностью 15 минут видео?
Возможное осложнение
Временные метки (DTS?) В примере MP4 не являются «хорошими» в том смысле, что эта ошибка возникает постоянно:
[сегмент @ 0x2abc7c0] Немонотонный DTS в выходном потоке 0: 0; предыдущий: 80990160, текущий: -74730276972; меняется на 80990161. Это может привести к неправильным временным меткам в выходном файле. DTS 191648787, следующий: -830336344130 st: 0 неверное удаление PTS 191648787, следующий: -830336344130 недействительный сброс st: 0
Однако мне не нужно, чтобы полученные видеофайлы действительно воспроизводились или оставались нетронутыми, поэтому я игнорирую это, если только это не влияет на сегментацию, которую мне нужно воссоздать.
Дальнейшая информация
версия ffmpeg:
\ # / usr / share / local / bin / ffmpeg -version ffmpeg версия N-79587-g9f9c833 Copyright (c) 2000-2016 разработчики FFmpeg построен с gcc 4.8 (Ubuntu / Linaro 4.8.2-16ubuntu4) конфигурация: --prefix = / home / t / dev / j / сторонняя / ffmpeg /../ build --cross-prefix = / usr / bin / arm-linux-gnueabihf- --cpu = armv7-a - -disable-shared --enable-static --enable-gpl --enable-pthreads --enable-несвободный --enable-libx264 --enable-filters --extra-libs = -static --extra-cflags = - статический --enable-кросс-компиляция --target-os = linux --disable-inline-asm --arch = armv7 --disable-debug --disable-altivec --disable-sse --disable-armv6 --disable -armv6t2 --disable-mmx --disable-neon --disable-amd3dnow --disable-thumb --extra-ldflags = -L / home / t / dev / j / третьей стороны / ffmpeg /../ build / lib --extra-cflags = -I / home / t / dev / j / сторонний / ffmpeg / ../ build / include --extra-ldflags = -L / home / t / dev / j / сторонний / ffmpeg / libavcodec --extra-ldflags = -L / home / t / dev / j / сторонний / ffmpeg / libavdevice --extra-ldflags = -L / home / t / dev / j / сторонний / ffmpeg / libavfilter --extra-ldflags = -L / home / t / dev / j / сторонний / ffmpeg / libavformat --extra-ldflags = -L / home / t / dev / j / сторонний / ffmpeg / libavresample --extra-ldflags = -L / home / t / dev / j / сторонний / ffmpeg / libavutil - extra-ldflags = -L / home / t / dev / j / сторонний / ffmpeg / libswscale --extra-ldflags = -lx264 --extra-ldflags = -lm --extra-ldflags = -ldl --extra- cflags = '- fpic -mthumb'-fpic -mthumb '-fpic -mthumb ' libavutil 55. 22.101 / 55. 22.101 libavcodec 57. 38.100 / 57. 38.100 libavformat 57. 34.103 / 57. 34.103 libavdevice 57. 0.101 / 57. 0.101 libavfilter 6. 44.100 / 6. 44.100 libswscale 4. 1.100 / 4. 1.100 libswresample 2. 0.101 / 2. 0.101 libpostproc 54. 0.100 / 54. 0.100
2 ответа на вопрос
0
Gyan
segment_timeдолжно сработать. Это относится к продолжительности сегмента, а не настенные часы.
Возможно, мешает размещение ключевого кадра, поэтому попробуйте
Я удалил параметр stream_loop, так как в настоящее время существует ошибка генерации метки времени, связанная с его использованием. Это может мешать и здесь.
Если вам нужен действительно длинный поток для работы, используйте демультиплексор concat.
Thanks for the help, much appreciated. The concat demuxer works. Using `-break_non_keyframes 1` doesn't change the behaviour. :-( All combinations of { stream_loop, concat } x { , break_non_keyframes } the behaviour is the same: there is a first segment created at about 3x the _size_ of the input file (I wasn't waiting long enough yesterday), and the second segment appears to grow without bound, to at least more than 3x the _size_ of the first segment. The video-time of the input isn't being respected. I'm going to look at those 'non-monotonous DTS' errors more closely.
studog 7 лет назад
0
0
studog
У меня есть рабочее решение.
Коренная причина
Образец файла захвата, который я сохранил, оказался не очень подходящим для нужных целей (бесконечный поток ввода), хотя в противном случае это хороший видеофайл (он воспроизводится нормально, хотя и не доступен для поиска). Эта проблема, по-видимому, связана с временными метками, а также, возможно, с одной или несколькими ошибками в мультиплексоре сегментов.
Используя captemp.mp4вместо этого я получаю хороший поток с любым stream_loop или Concat мультиплексором.
Я не уверен, в чем разница между capture-1469547000.mp4 и captemp.mp4; AtomicParsley показывает, что captemp.mp4 на 12 байтов короче в атоме 'elst'.
Еще раз посмотрев на мою первоначальную настройку, добавление segment_listпоказало, что сегменты генерируются правильно, но очень и очень быстро. Они просто добавлялись к существующему файлу сегмента, а не создавали новый. Это отчасти вина ...
strftime потенциальная ошибка
Я использовал strftimeс %sформатом. Оказалось, что strftime использует время часов хост-машины, а не время из сегмента видео. Это верно даже в «рабочем» случае; %dВместо этого я перешел на использование форматирования сглаживающего сегмента .
Вероятно, это ошибка, и почему в нерабочем случае сегменты добавляются друг к другу.
Я вполне уверен, что использование -reфлага обойдёт эту проблему, замедляя обработку, но я действительно хочу ускоренную обработку. Так что я не пробовал это.