¿Cómo puedo establecer un nivel de perfil h.264 con ffmpeg?

16

Tengo una película (m4v / h.264 / AAC) que funciona bien en mi Mac, pero recientemente descubrí que no se reproducirá en mi Apple TV3. Después de mirar las propiedades de este archivo de película, veo que tiene un perfil [email protected] pero Apple TV3 solo admite hasta [email protected]. Creo que la única propiedad que hace que este video sea incompatible es la velocidad de bits máxima del video, todas las demás propiedades parecen admitidas en [email protected].

¿Cómo puedo usar ffmpeg para degradar este video a [email protected]?

¿O tengo que cambiar la propiedad real (velocidad de bits máxima) que hace que este video sea 4.1 en lugar de 4.0? Me preocupa que si solo cambio la velocidad de bits, aunque el archivo sería compatible con [email protected], todavía se 'etiquetaría' como [email protected] y, por lo tanto, todavía no se reproduciría en mi Apple TV3.

Sam
fuente

Respuestas:

22

Al codificar con libx264, puede establecer el perfil y nivel H.264 con:

  • -profile:v- uno de high, maino baseline(y otros, pero esto es irrelevante aquí)
  • -level:v- tal como se define en el Anexo A de la norma H.264, por ejemplo, 4.0.

Por ejemplo:

ffmpeg -i input.mp4 -c:v libx264 -profile:v high -level:v 4.0 -c:a copy output.mp4

Aquí acabamos de copiar la transmisión de audio, ya que no se verá afectada.

La salida tendrá el perfil y nivel correctos establecidos en sus metadatos. Puede verificar esto mientras codifica, donde x264dice algo como:

[libx264 @ 0x7fb26103a000] profile High, level 4.0

MediaInfo también puede ayudarlo a analizar los detalles del contenedor y el códec.

Por supuesto, volver a codificar el video degradará su calidad hasta cierto punto, dado que está aplicando una conversión con pérdida nuevamente. Intente configurar la -crfopción para influir en el parámetro de calidad constante. El valor predeterminado aquí es 23, mientras que los valores entre 18 y 28 se consideran cuerdos. Menor significa mejor calidad. Si su entrada tiene una tasa de bits de hasta 65,000 kBit / s, es probable que todavía se vea bastante bien después de la conversión.

slhck
fuente
1
Eso funcionó bien. Desafortunadamente, perdió parte de los metadatos, pero el video real no tuvo ningún cambio notable en la calidad. Por interés, ¿el siguiente comando habría logrado lo mismo? ffmpeg -i input.mp4 -vcodec x264 -vprofile high -vlevel 4.0 -acodec copy output.mp4
Sam
Sí, las -vopciones son alias de las :vmismas. ¿Qué metadatos perdiste?
slhck
Creo que podría haber sido la obra de arte que se perdió. No sé si eso se considera técnicamente metadatos ... ¿Está la obra de arte realmente contenida dentro del archivo? No revisé todo lo demás antes de agregarle todo nuevamente.
Sam
Ahora tengo un archivo diferente con un problema similar. Es el nivel de perfil incorrecto, pero el resto de las especificaciones parecen ser compatibles con mi nivel requerido (4.0). Si uso los comandos que proporcionó anteriormente, ¿dejará los datos intactos a menos que sean incompatibles con el nivel de perfil ingresado? Básicamente, no quiero que ffmpeg toque ninguno de los datos que no sean la etiqueta que dice qué perfil y nivel es. ¿Es eso posible o va a establecer todos los valores (nitrato, framerate, etc.) en valores preestablecidos?
Sam
2
Acabo de encontrar una manera de lograr esto. Subler realmente tiene una opción, cuando selecciona la transmisión de video, para cambiar el perfil y el nivel para que sea compatible con ciertos dispositivos. Le dice que se asegure de que el video sea compatible con el perfil que está configurando, por lo que no creo que vuelva a codificar, solo debe cambiar los metadatos.
Sam
1

En referencia a tu comentario , prueba este comando:

ffmpeg -i input.mp4 -map 1 -c:v libx264 -profile:v high -level:v 4.0 -c:a copy \
# copies all global metadata from input.mp4 to output.mp4
-map_metadata 0 \
# copies video stream metadata from input.mp4 to output.mp4
-map_metadata:s:v 0:s:v \
# copies audio stream metadata from input.mp4 to output.mp4
-map_metadata:s:a 0:s:a \
output.mp4

Salud

Riccardo Volpe
fuente