¿Cómo puedo buscar con precisión una transmisión AVC MPEG-TS en FFMPEG?

¿Cómo puedo buscar con precisión una transmisión AVC MPEG-TS en FFMPEG?

Tengo varias grabaciones de video de canales IPTV Full HD que almacené usando VLC. Estos volcados de secuencias se almacenan como archivos MPEG-TS y contienen vídeo codificado en AVC con audio MPEG.

Me gustaría extraer clips específicos de estas grabaciones, en función de puntos de corte con precisión de fotograma. Sin embargo, estoy teniendo dificultades para determinar las marcas de tiempo exactas de milisegundos que debo pasar.FFMPEG-ssy parámetros para alcanzar los puntos de corte que -toquiero con precisión. Esto es lo que he probado hasta ahora:

Intento 1

Mi intento inicial fue cargar los .tsarchivos enAvidemuxya que permite una búsqueda cómoda cuadro por cuadro y muestra la marca de tiempo del cuadro actual con la precisión necesaria. Sin embargo, si pongo la marca de tiempo de un fotograma que busqué (en formato HH:MM:SS.mmm) en elFFMPEGparámetros, el corte en realidad se desviará en varios fotogramas, a veces más de un segundo. La deriva es diferente para cada archivo y puede ser positiva o negativa.

Luego me di cuenta de que en la mayoría de estas grabaciones, en el primer fotogramaAvidemuxen realidad muestra una marca de tiempo que no es cero (por ejemplo, 00:00:00.280o incluso 00:00:00.216). lo asumoVLCinicia la grabación inmediatamente, peroAvidemuxignora todo hasta el primer fotograma I. Sin embargo , todavía me pregunto ante una marca de tiempo como 00:00:00.216, porque estos videos están a 25 fps y 216 ni siquiera es un múltiplo de 40 ms.

ingrese la descripción de la imagen aquí

Intento 2

Probé un proceso de dos pasos, en el que codificaba el video una vez, iniciando la codificación un poco antes del corte que quiero y terminándolo un poco después del final que quiero. entonces usaríaAvidemuxpara contar los fotogramas sobrantes al principio y al final del vídeo, y mover los puntos de corte hacia nFrames * 40 msadentro. Sin embargo, los resultados fueronaúnNo es preciso, a veces me llevaría a acortar el vídeo en muy pocos fotogramas, a veces en demasiados.

Perdiendo la confianza enAvidemuxla precisión de la marca de tiempo, o al menos concluir que realiza algunos cálculos de manera diferente aFFMPEG, Pensé que la forma más segura sería usar la misma herramienta para determinar los puntos de corte que también uso para cortar el video.

Intento 3

Intenté extraer cuadros individuales alrededor de los puntos de corte deseados usando FFMPEG, usando los mismos -ssparámetros -toque uso para cortar el video, pero seleccionando solo un rango cercano a los puntos de corte deseados y escribiendo los cuadros en archivos de imagen. También usaría un filtro para grabar la marca de tiempo exacta de cada fotograma, según lo determinado porFFMPEG, directamente en la imagen. De esa manera podría leer los puntos de corte deseados y usarlos para la codificación real. Mi línea de comando se vería así:

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}':[email protected]:x=10:y=10 image%03d.png

Luego encontraría el PNG exacto en el que quiero que esté el corte, miraría la marca de tiempo y, si dijera 00:00:30.160, esa sería la marca de tiempo que usaría para el -sscorte real.

ingrese la descripción de la imagen aquí

Sin embargo, estoaúnno funcionó y mis puntos de corte todavía están varios fotogramas antes o después que los PNG extraídos. tan cambiandoFFMPEGLa salida de video a imágenes parece afectar la forma en que se calculan las marcas de tiempo, ¡porque no coinciden!


Hasta ahora no he encontrado una manera de evitar tener que hacer un largo proceso de búsqueda binaria para aproximarme manualmente a las marcas de tiempo exactas en las que deben estar los cortes, lo cual es especialmente engorroso porque solo puedo obtener las marcas de tiempo que necesito haciendo "decodificación completa". busca" (es decir, usar -ssdespués del parámetro de entrada, no antes) y puede llevar mucho tiempo buscar una posición varias horas después de una grabación.

¿Cómo puedo encontrar la marca de tiempo que necesito para obtener un corte exacto del fotograma?FFMPEGen un flujo de transporte MPEG, sin tener que decodificar, cortar y guardar los segmentos de video varias veces para avanzar manualmente hacia ellos?

Aquí está elInformación de los mediosen una de las grabaciones, en caso de que contenga alguna pista sobre algo extraño con las transmisiones mismas:

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

Información adicional:La variación de la marca de tiempo es diferente para cada archivo, pero es constante dentro de cada archivo. Es decir, si necesito hacer varios cortes en un video y para un corte determino que la marca de tiempo dada en las imágenes extraídas conFFMPEGsiempre es 160 ms menor de lo que necesito usar -ss, puedo usar ese mismo desplazamiento para el resto de los cortes en el mismo archivo, y será preciso.

información relacionada