imagen + audio = mp4: ¿cómo hacer que el video sea más pequeño?

12

Estoy usando ffmpeg para agregar un JPG a un MP4 para hacer un MP4.

Como solo hay una imagen para hacer el video, me pregunto si hay una manera de reducir el tamaño del video.

Mando:

$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4

Resultados:

  • image.jpg = 26.7K (imagen no tan clara)
  • audio.mp3 = 64.6M (54 minutos)
  • output.mp4 = 80.6M (el resultado del video no es tan claro, la música sigue siendo buena)

¿Es un tamaño razonable para MP4?

SIDU
fuente
¿Podría publicar el comando ffmpeg que usa?
ridículo
No haga imágenes de (parte del) texto, sino que cópielo y péguelo en su lugar. Las imágenes son grandes, no se pueden buscar y no se pueden copiar.
llogan
oops si señor. He cerrado la ventana de cmd, así que no puedo pegar el texto ahora: |
SIDU
Me pregunto si es posible meta mp4 para que solo
reproduzca
¿Cuál es el jugador, dispositivo o sitio de destino para la salida?
llogan

Respuestas:

18

Para subir a YouTube

H.264: archivos más pequeños

Este método usa libx264 para codificar video H.264. Es más lento que el método de copia de flujo a continuación, pero potencialmente generará un tamaño de archivo más pequeño.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv

Copia de flujo: proceso más rápido

Este método solo transmite copias (sin codificación) de la imagen al contenedor MKV. Es súper rápido, pero si el tamaño es importante, el método anterior puede producir un archivo más pequeño.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
  • YouTube acepta casi cualquier cosa, por lo que estos comandos utilizan algunos trucos para acelerar la codificación o reducir el tamaño del archivo y mantener la calidad alta porque YouTube volverá a codificar lo que le des. A tu jugador probablemente no le gustará, pero YouTube sí.

  • En estos ejemplos, se utiliza una velocidad de cuadro muy baja que debería procesarse más rápido que el valor predeterminado de 25 fps.


La más amplia compatibilidad para cualquier jugador.

ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
  • Esto debería jugar en casi cualquier cosa, excepto en dispositivos muy antiguos (cambie -profile:v maina -profile:v baselinesi ese es el caso).

  • Si su entrada de audio ya es AAC, cambie -c:a aaca -c:a copypara evitar una codificación innecesaria.

  • El tiempo de codificación será más largo y el tamaño del archivo será mayor que los comandos de YouTube anteriores.

  • Ver FFmpeg Wiki: H.264 para más información.

lema
fuente
¿Podría proporcionar una línea de código para hacer a.jpg + a.mp3 = a.mp4 en 1280 * 720 con los marcos / seg más bajos permitidos por youtube? Además, como solo hay un trabajo, ¿debo eliminar "-loop 1"? Gracias por adelantado.
SIDU
@SIDU El comando existente hace lo que usted solicita (aparte de generar MKV en lugar de MP4), pero no sé cuál es la velocidad de fotogramas más baja que admite YouTube. Solo tendrás que experimentar. ¿Por qué necesita MP4 cuando acaba de subir a YouTube?
llogan
Lo intenté pero dice:Unrecognized option 'preset'. Error splitting the argument list: Option not found
NineCattoRules
@NineCattoRules Difícil de decir sin más información. Use un sitio pastebin para mostrar su ffmpegcomando completo y la salida completa de la consola del comando, luego proporcione el enlace en un comentario.
llogan
¡Gracias, reinstalé FFMPEG usando el repositorio mc3man y ahora funciona bien!
NineCattoRules
3

Con solo la información que proporcionó, esto es lo que puedo pensar.

Vamos por partes:

Como solo hay una imagen agregada al video. Me pregunto si hay una manera de reducir el tamaño del video, por ejemplo, forzar la tasa de bits / segundo = 1 en lugar de 28.

Como es una imagen fija, no es necesario cambiarla. simplemente quedarse quieto.

De lo que estás hablando es de cuadros por segundo (fps), no tasa de bits. Y tienes razón en el concepto. Beign solo una imagen fija 1 fps no sería un problema.

¿Es un tamaño razonable para mp4? ¿Importa mucho el tamaño de la imagen?

En este caso, el tamaño de la imagen no tendría un peso significativo porque estamos tratando con una sola imagen fija. Si se tratara de un video de alta calidad, entonces es un problema diferente.

¿Debo cambiar el tamaño de jpg a 1080 * 720 y hacer ajustes adicionales en ffmpeg para que salgan como 720p (¿cuál es la configuración de ffmpeg entonces :)?

La resolución que estás diciendo es 1280x720.

No veo el punto en la -loop 1opción aquí, solo ralentizará el proceso. ¿Usó -shortestporque el archivo tiene más de 1 flujo de entrada? Si no, entonces no hay razón para usarlo. Como usaste -acodec copy, tendré que suponer que no quieres volver a codificarlo.

Para una salida de 720p 1 fps sin volver a codificar y sin tocar la tasa de bits:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4

Señale el caso de que tiene más de una secuencia de entrada y desea que ffmpeg termine la codificación en la secuencia más corta y luego:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4

Ahora, si tiene que cambiar la tasa de bits (digamos 1024k como ejemplo);

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4

Ver: limitar la tasa de bits de salida

-c: a copy = Copia el flujo de audio de entrada para que no se vuelva a codificar.

-b: v = La tasa de bits especificada para ser (no precisamente) constante.

-bufsize = Es el intervalo en el que se calcula la tasa de bits promedio. Es decir, la imagen con menor calidad de pérdida más pero tasas de bits más precisas de acuerdo con lo especificado en -b: v .

-s = El tamaño real de la salida de video.

-framerate = La velocidad de fotogramas de entrada que queremos que use la salida.

Tenga en cuenta que si aún desea un video de menor tamaño en algún momento, tendrá que sacrificar la calidad para lograrlo. Y otras formas de hacerlo implican volver a codificar con compresión con pérdida.

Por lo que dices, la información que brindas y lo que intentas hacer, creo que parece que tu objetivo es incrustar la carátula del álbum en mp3. Si ese es su objetivo, esto se adaptaría mejor a sus necesidades:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata = El especificador de metadatos ffmpeg para generar el archivo desde el archivo. En este caso ( cero ) los metadatos globales.

-map 0 = flujo de entrada 1 (audio).

-map 1 = flujo de entrada 2 (imagen).

Si nada aquí satisface sus solicitudes, brinde más información.

Fenrir
fuente
Considere usar -frameratecomo una opción de entrada y eliminar la salida -r: de lo contrario, se usará la velocidad de fotogramas de entrada predeterminada de 25 y luego ffmpegse caerán los cuadros para lograr -r 1. Si solo declara la velocidad de fotogramas de entrada, la salida utilizará la misma velocidad de fotogramas.
llogan
Gracias. No lo sabia. Editado para reflejar los cambios sugeridos.
Fenrir
Gracias por el tutorial. Mi línea de código original ffmpeg fue copiar y pegar de la búsqueda de google, que no tengo idea de qué es qué.
SIDU