FFmpeg, codifica video para reproducción de 720p @ 4mbps

He estado luchando con este dilema durante aproximadamente una semana o dos y he hecho todo lo posible para entenderlo a partir de lo que puedo encontrar a través de Google.

Lo que necesito (o al menos creo que necesito) hacer es calcular la tasa de bits para determinar los mbps, si está por encima de mi requisito (720p @ 4mbps), entonces quiero optimizar el video, si está por debajo de mi requisito, entonces es solo un cuestión de copiar el archivo a un contenedor mp4.

Ahora tengo mi propio código para FFmpeg, que adjuntaré a continuación, y descubrí que hay aplicaciones alternativas que me proporcionarán los kbps calculados a partir del archivo, pero quiero hacer todo lo posible con una sola aplicación si Puedo.

No le pido a nadie que codifique nada aquí, sino más bien que me diga cómo puedo calcular esto yo mismo usando la información que obtengo de FFmpeg o incluso de FFprobe, y qué parámetros necesitaría configurar dentro de FFmpeg para asegurarme de que el El archivo de video está codificado para transmitir a 4mbps.

ffmpeg -i "input.file" -map 0:0 -map 0:1 -map 0:1 -r 30 -profile:v Main -level:v 4.0 -crf 19 -c:a:0 copy -b:a:0 448k -metadata:s:a:0 language="english" -metadata:s:a:0 title="AC3 5.1" -c:a:1 libfdk_aac -ac:a:1 2 -b:a:1 160k -metadata:s:a:1 language="english" -metadata:s:a:1 title="AAC Stereo" -movflags +faststart "output.file"

Gracias por adelantado.

Actualizar a mi código original

Este nuevo código incluye el tamaño de mejora de la tasa de bits y la tasa máxima (si es necesario), en mi secuencia de comandos, si los fps superan los 30, se configurará en 30; de lo contrario, se dejó solo, pero si el fps es incierto, ejemplo 23.970542342, esto puede producir un error en FFmpeg, pensé que "-r 23.97" solucionaría esto, pero aparentemente no, así que tuve que cambiar "-r" a "-filter:v fps=" y configurar los fps para mis archivos calculando "r_frame_rate" , que es bastante fácil.

mi nuevo codigo

ffmpeg -i "input.file" -map 0:0 -map 0:1 -map 0:1 -filter:v fps=30 -profile:v Main -level:v 4.0 -crf 18 -b:v 4000k -bufsize 4000k -maxrate:v 4000k -metadata title="" -metadata year="" -c:a:0 copy -metadata:s:a:0 language="english" -metadata:s:a:0 title="AC3 5.1" -c:a:1 libfdk_aac -ac:a:1 2 -b:a:1 160k -metadata:s:a:1 language="english" -metadata:s:a:1 title="AAC Stereo" -movflags +faststart "output.file"

En el script que estoy construyendo, generará los parámetros apropiados para FFmpeg, por lo que si el códec no es x264, si el perfil:v no es principal, si el nivel:v no es 4.0, si la tasa de bits es más de 4000k, luego se establecerán todos los parámetros necesarios; de lo contrario, se copiará.

Código FFprobe de Mulvya, ligeramente modificado para que pueda obtener todo lo que necesito de él.

ffprobe -v error -select_streams v -show_entries stream="bit_rate,codec_name,profile,level,r_frame_rate" -of compact=p=0:nk=1 "input.file"

El objetivo al final de esto es tener mi propia secuencia de comandos de automatización para codificar mis videos desde una carpeta, sé sobre el automatizador de mp4 de sickbeard, pero no necesito todas esas funciones, y hay cosas que quiero que no tiene .

Respuestas (1)

El siguiente comando ffprobe escupirá la tasa de bits:

ffprobe in.mp4 -select_streams v -show_entries stream=bit_rate -of compact=p=0:nk=1

p.ej

4118620

Si el resultado es mayor que 4000000entonces puede agregar -b:v 4000k -bufsize 4000k -maxrate:v 4000k. O puedes agregarlo de todos modos. Establézcalo -c:ven copysi la transmisión está bajo 4000000otra cosa que libx264. Los tres valores se ignorarán al igual que -b:a:0 448ken su comando.

Gracias @Mulvya, la tasa de bits fue un poco confusa para mí, así que supongo que la tasa de bits es bits por segundo. y 4000000 = 4 Mbps?, lo probaré y volveré lo antes posible. El comando "-b:a:0 448k" e incluso "-b:a:1 160k", no se ignora cuando ejecuto mi script actual, si fuera a generar la información, ambas transmisiones de audio muestran lo que configuré , en cuanto a bit_rate, no pensé en compararlo con el bit_rate general, pensé que había más que eso jajaja.
Cuando c:ase establece en copypara una transmisión, b:aestá inerte ya que no se está realizando ninguna codificación.
Ah, cierto, eché un vistazo a los archivos que ya tenían el audio de 448k, por lo que tiene sentido por qué siempre fue lo mismo que mi salida jajaja. Solo un pensamiento rápido y una última pregunta jajaja, ¿no puedo usar "-maxrate:v" solo durante la codificación para asegurarme de que no exceda mi requisito? ¿O sería más práctico incluir "-b:v" y "-buffsize"?
Si -b:vno se establece, se usa el valor predeterminado (200k) o, en el caso de x264, se usa el modo CRF en lugar de la segmentación por tasa de bits.