![Cómo concatenar varios archivos MP3 de audio cortos con una duración de superposición específica](https://rvso.com/image/1520089/C%C3%B3mo%20concatenar%20varios%20archivos%20MP3%20de%20audio%20cortos%20con%20una%20duraci%C3%B3n%20de%20superposici%C3%B3n%20espec%C3%ADfica.png)
Tengo archivos MP3 que tienden a ser muy cortos, como 1 segundo, y contienen sílabas de palabras. Me gustaría tener una superposición (el final de uno se fusiona con el comienzo del siguiente). He encontrado varios temas sobre crossfading pero no estoy seguro de necesitarlo (crossfading), es decir, bajar el volumen de uno y subir el volumen del siguiente a medida que pasamos a él. Creo que en este momento basta con fusionar el audio.
La superposición debe ser del orden de microsegundos. Veo que FFmpeg tiene decimales de segundo en algunas de las opciones. Actualmente estoy concatenando un montón de MP3 cortos con lo siguiente:
/// <summary>
/// <para/>20170114
/// </summary>
/// <returns></returns>
public void ConcatMP3s(String InFiles, String OutputFile)
{
// http://superuser.com/questions/87040/how-to-stich-mp3s-together-with-ffmpeg
var _IN_PARAMS = " -f concat ";
var _IN_FILES = "-safe 0 -i " + DQuote(InFiles);
var _OUT_PARAMS = " -c copy -y "; // -y to overwrite the output file
var _OUT_FILE = DQuote(OutputFile);
//
var _FFMPEG_ARGS = _IN_PARAMS + _IN_FILES + _OUT_PARAMS + _OUT_FILE;
//return _FFMPEG_ARGS;
//
RunFFmpeg(_FFMPEG_ARGS);
}
Me gustaría un comando o técnica que concatene varios archivos a la vez, pero si me muestra cómo hacerlo para dos archivos, puedo recorrerlos todos. Es una respuesta fea pero aceptable :).
@Mulvya, lo que pude obtener de su enlace es la siguiente estructura de línea de comando de FFmpeg (todo en una cadena de línea de comando)
ffmpeg -i 1.mp3 -i 2.mp3 -i 3.mp3 -i 4.mp3
-filter_complex
"[1]adelay=delay1|delay1[b];
[2]adelay=delay2|delay2[c];
[3]adelay=delay3|delay3[d];
[0][b][c][d]amix=4"
merged.mp3
¿Cuáles deben ser retraso1, retraso2 y retraso3? ¿Son las duraciones en milisegundos de 1.mp3
, 2.mp3
y 3.mp3
respectivamente?
¿Cuál es la mejor manera de recuperar estas duraciones? por ejemplo, ¿son precisas las propiedades de los archivos del sistema de archivos?
¿Son las letras [b], [c], [d] algo arbitrario? ¿nombres de canales? ¿Necesitaré generar?
¿Dónde especifico, por ejemplo, que se superpongan 10 milisegundos entre 1.mp3
y 2.mp3
, 2 y 3, y luego 3 y 4?
¿O debería restar 10 milisegundos al retraso1, retraso2, retraso3?
Además: aquí hay una instantánea de un montaje manual que preparé para explicar lo que estoy tratando de lograr mediante programación (supongamos una superposición constante; aquí estoy intentando unos 100 ms). Explique qué valores deben tener los valores anteriores para retardo1, retardo2 y retardo3.
Las duraciones de MP3 de la salida FFmpeg son 550, 440, 500, 960, 440 ms respectivamente.
========= Salida actual de FFmpeg
_VDO\FFmpeg 20160310\bin\FFmpeg -i "S:\_W\ARP_WEB\SRC\SND\A4_23\1\01.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A2\1\22.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A2\3\23.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A3\1\24.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A2\2\03.mp3" -filter_complex "[1]adelay=279[b];[2]adelay=592[c];[3]adelay=916[d];[4]adelay=1712[e]; [0][b][c][d][e]amix=5" -y "S:\_W\ARP\AMSSTUDIO\SRC\DATA\FFMPEG\DEBUG Concat with Overlap\OUT.MP3"
ffmpeg version N-79000-g66edd86 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 5.3.0 (GCC) configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmfx --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib libavutil 55. 19.100 / 55. 19.100 libavcodec 57. 28.100 / 57. 28.100 libavformat 57. 28.100 / 57. 28.100 libavdevice 57. 0.101 / 57. 0.101 libavfilter 6. 39.102 / 6. 39.102 libswscale 4. 0.100 / 4. 0.100 libswresample 2. 0.101 / 2. 0.101 libpostproc 54. 0.100 / 54. 0.100 [mp3 @ 0000000000584ba0] Estimating duration from bitrate, this may be inaccurate Input #0, mp3, from 'S:\_W\ARP_WEB\SRC\SND\A4_23\1\01.mp3': Duration: 00:00:00.55, start: 0.000000, bitrate: 320 kb/s Stream #0:0: Audio: mp3, 44100 Hz, mono, s16p, 320 kb/s [mp3 @ 00000000005a2a20] Estimating duration from bitrate, this may be inaccurate Input #1, mp3, from 'S:\_W\ARP_WEB\SRC\SND\A2\1\22.mp3': Duration: 00:00:00.44, start: 0.000000, bitrate: 320 kb/s Stream #1:0: Audio: mp3, 44100 Hz, mono, s16p, 320 kb/s [mp3 @ 000000000058af00] Estimating duration from bitrate, this may be inaccurate Input #2, mp3, from 'S:\_W\ARP_WEB\SRC\SND\A2\3\23.mp3': Duration: 00:00:00.50, start: 0.000000, bitrate: 320 kb/s Stream #2:0: Audio: mp3, 44100 Hz, mono, s16p, 320 kb/s [mp3 @ 000000000058cb80] Estimating duration from bitrate, this may be inaccurate Input #3, mp3, from 'S:\_W\ARP_WEB\SRC\SND\A3\1\24.mp3': Duration: 00:00:00.96, start: 0.000000, bitrate: 127 kb/s Stream #3:0: Audio: mp3, 44100 Hz, mono, s16p, 128 kb/s [mp3 @ 00000000005c5c00] Estimating duration from bitrate, this may be inaccurate Input #4, mp3, from 'S:\_W\ARP_WEB\SRC\SND\A2\2\03.mp3': Duration: 00:00:00.44, start: 0.000000, bitrate: 320 kb/s Stream #4:0: Audio: mp3, 44100 Hz, mono, s16p, 320 kb/s Output #0, mp3, to 'S:\_W\ARP\AMSSTUDIO\SRC\DATA\FFMPEG\DEBUG Concat with Overlap\OUT.MP3': Metadata: TSSE : Lavf57.28.100 Stream #0:0: Audio: mp3 (libmp3lame), 44100 Hz, mono, fltp (default) Metadata: encoder : Lavc57.28.100 libmp3lame Stream mapping: Stream #0:0 (mp3) -> amix:input0 Stream #1:0 (mp3) -> adelay Stream #2:0 (mp3) -> adelay Stream #3:0 (mp3) -> adelay Stream #4:0 (mp3) -> adelay amix -> Stream #0:0 (libmp3lame) Press [q] to stop, [?] for help Error while filtering: Cannot allocate memory size= 5kB time=00:00:00.54 bitrate= 70.2kbits/s speed=42.3x video:0kB audio:4kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.938003%
Respuesta1
Utilice un comando del formulario
ffmpeg -i 1.mp3 -i 2.mp3 -i 3.mp3 -i 4.mp3
-filter_complex
"[1]adelay=delay1|delay1[b];
[2]adelay=delay2|delay2[c];
[3]adelay=delay3|delay3[d];
[0][b][c][d]amix=4"
merged.mp3
Cada uno, delayN
en milisegundos, es el desplazamiento inicial de un audio desde el inicio de la transmisión de audio. Entonces, si desea que el archivo 2 comience a los 14,2 segundos de la mezcla final, utilícelo adelay=14200|14200
como entrada estéreo. Puedes usarlo adelay=14200
para una entrada mono. En su captura de pantalla, estos son los valores de la columna Inicio.
Los pads de etiquetas [a]
, etc. son arbitrarios y se asignan a las salidas de los filtros para que puedan usarse más tarde en otros filtros o asignarse para la salida. Cada almohadilla se puede consumir una vez. Son alfanuméricos pero evitan asignar números enteros puros, [2]
ya que ffmpeg los usa para referirse a los archivos de entrada.