![So verketten Sie mehrere kurze MP3-Audiodateien mit einer bestimmten Überlappungsdauer](https://rvso.com/image/1520089/So%20verketten%20Sie%20mehrere%20kurze%20MP3-Audiodateien%20mit%20einer%20bestimmten%20%C3%9Cberlappungsdauer.png)
Ich habe MP3-Dateien, die normalerweise sehr kurz sind, etwa 1 Sekunde, und Wortsilben enthalten. Ich hätte gerne eine Überlappung (das Ende einer Datei wird mit dem Anfang der nächsten zusammengeführt). Ich habe mehrere Beiträge zum Thema Überblenden gefunden, bin mir aber nicht sicher, ob ich das (Überblenden) brauche, also die Lautstärke einer Datei zu verringern und die Lautstärke der nächsten zu erhöhen, wenn wir dazu übergehen. Ich denke, dass im Moment eine einfache Zusammenführung der Audiodaten ausreicht.
Die Überlappung muss im Bereich von Mikrosekunden liegen. Ich sehe, dass FFmpeg bei einigen Optionen Dezimalstellen von Sekunden hat. Derzeit verkette ich eine Reihe kurzer MP3s mit Folgendem:
/// <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);
}
Ich hätte gern einen Befehl oder eine Technik, mit der ich mehrere Dateien gleichzeitig verketten kann. Wenn Sie mir aber zeigen, wie das bei zwei Dateien geht, kann ich alle Dateien durchlaufen. Das ist eine hässliche, aber akzeptable Antwort :).
@Mulvya, was ich aus Ihrem Link entnehmen konnte, ist die folgende FFmpeg-Befehlszeilenstruktur (alles in einer Befehlszeilenzeichenfolge)
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
Welche Werte müssen delay1, delay2 und delay3 haben? Sind das die Dauern in Millisekunden von 1.mp3
, 2.mp3
, 3.mp3
bzw. ?
Wie lassen sich diese Zeiträume am besten abrufen? Sind beispielsweise die Dateieigenschaften des Dateisystems korrekt?
Sind die Buchstaben [b], [c], [d] beliebig? Kanalnamen? Muss ich sie generieren?
Wo gebe ich beispielsweise 10 Millisekunden Überlappung zwischen 1.mp3
und 2.mp3
, 2 und 3 und dann 3 und 4 an?
Oder sollte ich 10 Millisekunden von Verzögerung1, Verzögerung2, Verzögerung3 abziehen?
Ergänzung: Hier ist ein Schnappschuss einer manuellen Montage, die ich zusammengestellt habe, um zu erklären, was ich programmgesteuert erreichen möchte (nehmen Sie eine konstante Überlappung an; hier versuche ich es mit etwa 100 ms). Bitte erklären Sie, welche Werte für delay1, delay2, delay3 oben gelten sollten.
Die MP3-Dauer der FFmpeg-Ausgabe beträgt jeweils 550, 440, 500, 960 und 440 ms.
========= Aktuelle Ausgabe von 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%
Antwort1
Verwenden Sie einen Befehl der Form
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
Jeder Wert delayN
in Millisekunden ist der Startoffset eines Audios vom Beginn des Audiostreams. Wenn Sie also möchten, dass Datei2 bei 14,2 Sekunden des endgültigen Mixes beginnt, verwenden Sie adelay=14200|14200
für einen Stereoeingang. Sie können adelay=14200
für einen Monoeingang verwenden. In Ihrem Screenshot sind dies die Werte der Startspalte.
Die Label-Pads [a]
usw. sind beliebig und werden den Filterausgaben zugewiesen, sodass sie später in anderen Filtern verwendet oder für die Ausgabe zugeordnet werden können. Jedes Pad kann einmal verwendet werden. Sie sind alphanumerisch, aber vermeiden Sie die Zuweisung reiner Ganzzahlen, da [2]
ffmpeg diese verwendet, um auf die Eingabedateien zu verweisen.