FFprobe: ¿Es posible obtener la "posición buscada" de una transmisión de video sin volver a codificarla?

FFprobe: ¿Es posible obtener la "posición buscada" de una transmisión de video sin volver a codificarla?

Tengo el siguiente comando:

ffmpeg -f f32le -ar 44100 -channels 2 -i pipe:0 -ss 3 -i input.mp4 -y -f mp4 -map 0:a -map 1:v -c:v copy -use_editlist 0 output.mp4

Al copiar la transmisión de video en lugar de volver a codificarla, no puedo obtener ninguna información útil ffprobeque me indique la posición buscada de la transmisión de video.

Intenté recopilar información sobre la transmisión completa:

ffprobe -of json -show_streams -show_format output.mp4

Pero start_timelo es 0y la duración no se ve afectada. También intenté recopilar información sobre el primer cuadro de la transmisión de video:

ffprobe -of json -select_streams v -show_frames output.mp4

Todavía no hay información útil.

Sin embargo, cuando vuelvo a codificar la transmisión de video (eliminándola -c:v copydel comando), obtengo la información que deseo. La duración de la transmisión de video se modifica mediante la -ssopción. Por ejemplo si la duración del video es 5, entonces ffprobedevolvería una duración de 2 (5 menos 3), lo que me permite saber la posición buscada. Si también agrego un -copytsa la mezcla, entonces puedo obtener información útil verificando la información del primer fotograma.

¿Cómo puedo obtener la posición buscada sin tener que volver a codificar la transmisión de video? ¡Salud!

Respuesta1

Si tiene acceso al archivo original y ha utilizado

ffmpeg -f f32le -ar 44100 -channels 2 -i pipe:0 -ss X -i input.mp4 -y -f mp4 -map 0:a -map 1:v -c:v copy -use_editlist 0 output.mp4

entonces sigue este método.

1) Obtener la duración de la transmisión de video fuente

ffprobe source.mp4 -show_entries stream=duration -select_streams v -of compact=p=0 -v 0

Salida, por ejemplo

duration=229.033333

2) Obtener la duración y el primer PTS de la transmisión de video resultante

ffprobe output.mp4 -show_entries packet=pts_time:stream=duration -select_streams v -read_intervals 0%+#1 -of compact=p=0 -v 0

Salida, por ejemplo

pts_time=0.066667
duration=220.700000

Entonces, el primer fotograma del resultado es 229.033333 - 220.700000= 8.333333sdel flujo de origen.

Sin embargo, este no será el valor -ss, ya que es -ssposible que no apunte a un fotograma clave.

3), obtenga la duración y el PTS del primer paquete de audio. ffmpeg le dará una duración prolongada para sincronizar el audio con el -sscuadro especificado.

ffprobe output.mp4 -show_entries packet=pts_time,duration_time -select_streams a -read_intervals 0%+#1 -of compact=p=0 -v 0

Salida, por ejemplo

pts_time=0.000000|duration_time=2.733333

Entonces, 8.333333s + 2.733333 - 0.000000 - 0.066667= 11.000000ses el marco buscado.

información relacionada