Quiero codificar un video, que tiene una duración de 60 segundos, a un objetivo o tamaño máximo de 10 MB .
Hay dos enfoques que conozco. Uno se explica en el FFMPEG-Wiki, y el otro que encontré en la documentación. Desafortunadamente, no he encontrado una explicación sobre cuándo usar qué método.
¿Se recomienda alguno de esos métodos? Si no, ¿cuáles son las ventajas y desventajas de cada método?
1) Calcule y establezca Bitrate para que coincida con la duración del video como se explica en el ffmpeg-wiki
(10 MB * 8192 [convierte MB a kilobits]) / 60 segundos = ~ 1365 kbits / s bitrate total 1365k - 128k (bitrate de audio deseado) = 1237k bitrate de video
ffmpeg -y -i input -c:v copy -preset medium -b:v 1237k -pass 1 -c:a copy -b:a 128k -f mp4 /dev/null && \
ffmpeg -i input -c:v libx264 -preset medium -b:v 1237k -pass 2 -c:a libfdk_aac -b:a 128k output.mp4
2) Use el -fs
parámetro y deje que ffmpeg lo descubra.
ffmpeg -i input -c:v copy -c:a copy -preset medium -crf 23 -fs 10485760 output.mp4
libx264
comoc:v
. En elfs
ejemplo, no está transcodificando el video, ya que-c:v copy
se usa. Entonces,preset
ycrf
tampoco tienen ningún efecto.Respuestas:
El
fs
parámetro detendrá la codificación una vez que alcance su valor. Entonces, si la salida alcanza la10MB
marca mientras codifica el 15º segundo, entonces esa es la duración de su archivo de salida.Si desea asegurarse de que todo el archivo está codificado pero no cruza el tamaño objetivo establecido, utilice el método de velocidad de bits. Para acomodar la sobrecarga de muxing y otros datos dentro del tamaño objetivo, establezca su tasa de bits de video ligeramente más baja, digamos, 1-2%
fuente