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 ffprobe
que 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_time
lo es 0
y 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 copy
del comando), obtengo la información que deseo. La duración de la transmisión de video se modifica mediante la -ss
opción. Por ejemplo si la duración del video es 5, entonces ffprobe
devolvería una duración de 2 (5 menos 3), lo que me permite saber la posición buscada. Si también agrego un -copyts
a 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.333333s
del flujo de origen.
Sin embargo, este no será el valor -ss, ya que es -ss
posible 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 -ss
cuadro 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.000000s
es el marco buscado.