So verketten Sie mehrere kurze MP3-Audiodateien mit einer bestimmten Überlappungsdauer

So verketten Sie mehrere kurze MP3-Audiodateien mit einer bestimmten Überlappungsdauer

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.mp3bzw. ?

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.mp3und 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.

Schnappschuss einer manuellen Montage

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 delayNin 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|14200für einen Stereoeingang. Sie können adelay=14200fü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.

verwandte Informationen