tutorial - agregar audio silencioso en ffmpeg
ffmpeg tutorial (4)
Estoy tratando de usar ffmpeg para agregar una pista de audio silenciosa a un archivo MOV.
Creé una pista de audio silenciosa más larga que el video, y tengo la intención de usar la opción más corta con ffmpeg.
Usando SoX v14.3.1, ejecuto esto para generar un archivo wav:
sox -n -r 44100 -b 16 -c 2 -L silence.wav trim 0.0 60.000
# -n = Sox''s null file
# -r = sample rate
# -b = bits per sample
# -c = num of channels
# -L = little endian
# filename
# trim - is an effect, args start and length.
Mi comando básico de ffmpeg se ve así:
ffmpeg -shortest /
-i silence.wav -acodec pcm_s16le /
-i vid_no_sound.mov -vcodec copy vid_with_sound.mov
El resultado de esto es:
ffmpeg version 0.11.1 Copyright (c) 2000-2012 the FFmpeg developers
built on Aug 27 2012 13:11:25 with gcc 4.4.5
configuration: --extra-cflags=-static --prefix=/root/ffmpeg_build/src/ffmpeg-0.11.1 --enable-bzlib --enable-gnutls --enable-libfreetype --enable-libmp3lame --enable-libdc1394 --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-openssl --enable-zlib --enable-gpl --enable-nonfree --enable-version3
libavutil 51. 54.100 / 51. 54.100
libavcodec 54. 23.100 / 54. 23.100
libavformat 54. 6.100 / 54. 6.100
libavdevice 54. 0.100 / 54. 0.100
libavfilter 2. 77.100 / 2. 77.100
libswscale 2. 1.100 / 2. 1.100
libswresample 0. 15.100 / 0. 15.100
libpostproc 52. 0.100 / 52. 0.100
[wav @ 0x29ab2e0] max_analyze_duration 5000000 reached at 5015510
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, wav, from ''silence.wav'':
Duration: 00:01:00.00, bitrate: 1411 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from ''vid_no_sound.mov'':
Metadata:
major_brand : qt
minor_version : 537199360
compatible_brands: qt
creation_time : 2012-07-25 13:41:44
Duration: 00:00:14.50, start: 0.000000, bitrate: 27457 kb/s
Stream #1:0(eng): Video: qtrle (rle / 0x20656C72), rgb24, 1920x1080, 27450 kb/s, SAR 1920:1920 DAR 16:9, 24 fps, 24 tbr, 24 tbn, 24 tbc
Metadata:
creation_time : 2012-07-25 13:41:44
handler_name : Apple Alias Data Handler
Stream #1:1(eng): Data: none (tmcd / 0x64636D74)
Metadata:
creation_time : 2012-07-25 13:42:06
handler_name : Apple Alias Data Handler
timecode : 00:00:00:00
File ''vid_with_sound.mov'' already exists. Overwrite ? [y/N] y
auto-inserting filter ''auto-inserted resampler 0'' between the filter ''src'' and the filter ''aformat''
[aresample @ 0x2ab3b00] chl:stereo fmt:s16 r:44100Hz -> chl:stereo fmt:flt r:44100Hz
[NULL @ 0x2994320] Codec is experimental but experimental codecs are not enabled, try -strict -2
Output #0, mov, to ''vid_with_sound.mov'':
Stream #0:0(eng): Video: qtrle (rle / 0x20656C72), rgb24, 1920x1080 [SAR 1920:1920 DAR 16:9], q=2-31, 27450 kb/s, 24 fps, 90k tbn, 24 tbc
Metadata:
creation_time : 2012-07-25 13:41:44
handler_name : Apple Alias Data Handler
Stream #0:1: Audio: none, 44100 Hz, stereo, flt, 128 kb/s
Stream mapping:
Stream #1:0 -> #0:0 (copy)
Stream #0:0 -> #0:1 (pcm_s16le -> aac)
Error while opening encoder for output stream #0:1 - maybe incorrect parameters such as bit_rate, rate, width or height
He intentado agregar el -strict -2
como se sugiere, aunque no estoy seguro de dónde ponerlo en la línea de comandos.
He pasado dos horas intentando cosas diferentes y leyendo la documentación de ffmpeg, pero todavía estoy atascado.
¿Cómo agrego una pista de audio silenciosa a un archivo mov?
filtro de audio anullsrc
Puede usar ffmpeg
para crear el audio silencioso y combinarlo con un video en un solo paso. Este ejemplo usará el filtro de audio anullsrc
para generar audio estéreo silencioso con una frecuencia de muestreo de 44100:
ffmpeg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -i video.mov /
-shortest -c:v copy -c:a aac output.mov
-
channel_layout=stereo:sample_rate=44100
es el predeterminado, pero lochannel_layout=stereo:sample_rate=44100
solo como un ejemplo de cómo usar estas opciones.
Ignorando el audio existente
Si su archivo de entrada de video tiene audio que desea ignorar, utilice la opción -map
para anular el comportamiento de selección de transmisión predeterminado:
ffmpeg -f lavfi -i anullsrc -i video.mov -shortest -c:v copy -c:a aac /
-map 0:a -map 1:v output.mov
-
-map 0:a -map 1:v
se puede traducir como: desde la primera entrada (0
) use el audio (a
), y desde la segunda entrada (1
) use el video (v
).
Notas
Estos ejemplos reproducirán en secuencia el video para que no se vuelva a codificar (como "copiar y pegar").
Siempre se recomienda usar un
ffmpeg
reciente. Los enlaces a compilaciones recientes se encuentran en la página de descarga de FFmpeg o puede consultar una guía paso a paso para compilarffmpeg
.Si tu
ffmpeg
es antiguo, entonces necesitarás usar-strict experimental
para usar-c:a aac
.
Cree un video a partir de una imagen o conviértalo en un video y luego agregue el audio slient usando ffmpeg.
Puede usar el filtro de fuente de audio anullsrc en ffmpeg. Ejemplo para hacer un canal 5.1, frecuencia de muestreo de 48000 Hz, 10 segundos de archivo de video silencioso de la imagen:
ffmpeg -loop 1 -i img002.jpg -f lavfi -i anullsrc=channel_layout=5.1:sample_rate=48000 -t 10 -c:v libx264 -t 10 -pix_fmt yuv420p -vf scale=480:320 -y output.mp4
img002.jpg: archivo de imagen de entrada
-i anullsrc: agregar audio silencioso
-t 10: número de segundos
scale = 480: 320: ancho de resolución de video = 420 y altura = 320
-y: sobrescribir el archivo de salida existente
output.mp4: archivo de salida
El orden importa He probado el comando sox anterior y el comando ffmpeg a continuación y funciona
ffmpeg -shortest -i silence.wav -acodec pcm_s16le -i out.mov -vcodec copy -strict -2 vid_with_sound.mov
En caso de que alguien más termine aquí a través de "un motor de búsqueda", aquí hay un comando para el último ffmpeg , funciona con MP4 (H264 / AVC):
ffmpeg -f lavfi -i aevalsrc=0 -i input.mp4 -vcodec copy -acodec aac -map 0:0 -map 1:0 -shortest -strict experimental -y out.mp4