Как я могу точно найти поток AVC MPEG-TS в FFMPEG?

У меня есть несколько видеозаписей с каналов IPTV Full HD, которые я сохранил с помощью VLC. Эти дампы потока хранятся в виде файлов MPEG-TS и содержат видео в кодировке AVC со звуком MPEG.

Я хотел бы извлечь из этих записей определенные клипы, основываясь на точках отсечения с точностью до кадра. Однако мне сложно определить точные отметки времени в миллисекундах, которые мне нужно передать FFMPEGс -ss и -to параметры для точного попадания в нужные мне точки. Вот что я пробовал до сих пор:

Попытка 1

Моя первая попытка заключалась в том, чтобы загрузить .ts файлы в Авидемукс поскольку он обеспечивает удобный покадровый поиск и отображает временную метку текущего кадра с необходимой точностью. Однако, если я поставлю метку времени кадра, к которому стремился (в формате HH:MM:SS.mmm) в FFMPEG параметры, обрезка будет фактически отключена на несколько кадров, иногда более чем на секунду. Дрейф всегда разный и может быть положительным или отрицательным.

Затем я заметил, что для большинства этих записей первый кадр Авидемукс на самом деле показывает отметку времени, которая не равна нулю (например, 00:00:00.280 или даже 00:00:00.216). Я предполагал, что VLC немедленно начинает запись, но Авидемукс игнорирует все до первого I-кадра. Я все еще удивляюсь такой отметке времени, как 00:00:00.216хотя, потому что это видео со скоростью 25 кадров в секунду, а 216 даже не кратно 40 мс.

введите описание изображения здесь

Попытка 2

Я попробовал двухпроходный процесс, в котором я закодировал видео один раз, начав кодирование немного раньше, чем нужно, и заканчивал его чуть позже желаемого конца. Я бы тогда использовал Авидемукс для подсчета лишних кадров в начале и в конце видео, а также для перемещения точек вырезания на nFrames * 40 ms внутренности. Однако результаты были Все еще неточно, это привело бы меня к тому, что иногда я сокращал видео слишком мало кадров, иногда слишком много.

Теряя доверие к Авидемуксточность отметки времени или, по крайней мере, вывод о том, что некоторые вычисления выполняются иначе, чем FFMPEG, Я подумал, что самым безопасным способом будет использовать тот же инструмент для определения точек вырезания, который я также использую для фактического вырезания видео.

Попытка 3

Я попытался извлечь отдельные кадры вокруг желаемых точек разреза с помощью FFMPEG, используя тот же -ss и -to параметры, которые я использую для обрезки видео, но выбираю только диапазон, близкий к желаемым точкам вырезания, и записываю кадры в файлы изображений. Я бы также использовал фильтр, чтобы записывать точную временную метку каждого кадра, как определено FFMPEG, прямо в картинку. Таким образом, я мог просто считывать желаемые точки разреза и использовать их для фактического кодирования. Моя командная строка будет выглядеть примерно так:

ffmpeg.exe -i input.ts -ss 00:00:29.000 -to 00:00:31.000 -vf drawtext=fontfile=roboto.ttf:fontsize=40:text="%{pts:hms}":fontcolor=white@0.75:x=10:y=10 image%03d.png

Затем я бы нашел точный PNG, в котором я хочу, чтобы был вырезан, посмотрел на метку времени, и если бы она сказала 00:00:30.160, это будет метка времени, которую я бы использовал для -ss фактического разреза.

введите описание изображения здесь

Однако это Все еще не сработало, и мои точки вырезания все еще на несколько кадров раньше или позже извлеченных PNG. Так меняется FFMPEGвывод из видео в изображения, кажется, влияет на то, как рассчитываются временные метки, потому что они не совпадают!


До сих пор я не нашел способа избежать необходимости выполнять длительный процесс двоичного поиска, чтобы вручную приблизиться к точным временным меткам, на которых должны быть сокращения, что особенно обременительно, потому что я могу получить только нужные мне временные метки, выполнив «полное декодирование» ищет «(т. е. используя -ss после входного параметра, а не до), и поиск позиции может занять много времени после нескольких часов записи.

Как мне найти временную метку, которая нужна для точного кадрирования из FFMPEG в транспортном потоке MPEG без необходимости многократно декодировать, вырезать и сохранять сегменты видео, чтобы вручную продвигаться к ним?

Здесь Медиа информация на одной из записей, если она содержит какие-либо подсказки о чем-то странном с самими потоками:

General
ID                                       : 1 (0x1)
Complete name                            : C:Users…vlc-record-2021-03-09-00h23m11s.ts
Format                                   : MPEG-TS
File size                                : 2.31 GiB
Overall bit rate mode                    : Variable

Video
ID                                       : 256 (0x100)
Menu ID                                  : 1 (0x1)
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L4
Format settings                          : CABAC / 4 Ref Frames
Format settings, CABAC                   : Yes
Format settings, Reference frames        : 4 frames
Codec ID                                 : 27
Width                                    : 1 920 pixels
Height                                   : 1 080 pixels
Display aspect ratio                     : 16:9
Frame rate                               : 25.000 FPS
Standard                                 : Component
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Interlaced
Scan type, store method                  : Separated fields
Scan order                               : Top Field First
Color range                              : Limited
Color primaries                          : BT.709
Transfer characteristics                 : BT.709
Matrix coefficients                      : BT.709

Audio
ID                                       : 257 (0x101)
Menu ID                                  : 1 (0x1)
Format                                   : MPEG Audio
Format version                           : Version 1
Format profile                           : Layer 2
Codec ID                                 : 3
Bit rate mode                            : Constant
Bit rate                                 : 128 kb/s
Channel(s)                               : 2 channels
Sampling rate                            : 48.0 kHz
Compression mode                         : Lossy
Delay relative to video                  : -248 ms

Menu
ID                                       : 4096 (0x1000)
Menu ID                                  : 1 (0x1)
List                                     : 256 (0x100) (AVC) / 257 (0x101) (MPEG Audio)
Service name                             : Service01
Service provider                         : FFmpeg
Service type                             : digital television

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *