![特定の重複期間で複数の短いオーディオ MP3 ファイルを連結する方法](https://rvso.com/image/1520089/%E7%89%B9%E5%AE%9A%E3%81%AE%E9%87%8D%E8%A4%87%E6%9C%9F%E9%96%93%E3%81%A7%E8%A4%87%E6%95%B0%E3%81%AE%E7%9F%AD%E3%81%84%E3%82%AA%E3%83%BC%E3%83%87%E3%82%A3%E3%82%AA%20MP3%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%80%A3%E7%B5%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.png)
単語の音節を含む、1 秒程度の非常に短い MP3 ファイルがあります。オーバーラップ (1 つのファイルの終わりを次のファイルの始めと結合) を希望しています。クロスフェードに関するトピックをいくつか見つけましたが、クロスフェード (つまり、1 つのファイルの音量を下げて、次のファイルに移行するときに次のファイルの音量を上げる) が必要かどうかはわかりません。現時点では、オーディオを結合するだけで十分だと思います。
オーバーラップはマイクロ秒単位にする必要があります。FFmpeg のオプションの一部には秒単位の小数点があります。現在、私は次のような短い MP3 を連結しています。
/// <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);
}
一度に複数のファイルを連結するコマンドまたはテクニックが欲しいのですが、2 つのファイルに対してそれを実行する方法を示していただければ、それらすべてをループすることができます。醜いですが、受け入れられる回答です :)。
@Mulvya、あなたのリンクから私が取得できたのは、次の FFmpeg コマンドライン構造です (すべてが 1 つのコマンドライン文字列に含まれています)
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
delay1、delay2、delay3 はどのくらいにする必要がありますか? これらはそれぞれ、、1.mp3
のミリ秒単位の期間ですか?2.mp3
3.mp3
これらの期間を取得する最適な方法は何ですか? たとえば、ファイル システムのファイル プロパティは正確ですか?
[b]、[c]、[d]の文字は任意のものですか?チャンネル名ですか?生成する必要がありますか?
たとえば、1.mp3
と2.mp3
、 2 と 3、 3 と 4 の間に 10 ミリ秒の重複を指定するには、どこにすればよいですか?
それとも、delay1、delay2、delay3 から 10 ミリ秒を減算する必要がありますか?
追加: これは、プログラムで何を実現しようとしているのかを説明するためにまとめた手動モンタージュのスナップショットです (一定のオーバーラップを想定し、ここでは約 100 ミリ秒を試しています)。上記の delay1、delay2、delay3 の値がどのような値になるのか説明してください。
FFmpeg 出力からの MP3 の長さはそれぞれ 550、440、500、960、440 ミリ秒です。
========= 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%
答え1
次のようなコマンドを使用します
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
それぞれdelayN
ミリ秒単位で、オーディオ ストリームの開始からのオーディオの開始オフセットです。したがって、ファイル 2 を最終ミックスの 14.2 秒から開始する場合は、adelay=14200|14200
ステレオ入力に を使用します。adelay=14200
モノラル入力には を使用できます。スクリーンショットでは、これらは開始列の値です。
ラベル パッド[a]
..etc は任意であり、フィルターの出力に割り当てられるため、後で他のフィルターで使用したり、出力にマップしたりできます。各パッドは 1 回使用できます。これらは英数字ですが、[2]
ffmpeg は入力ファイルを参照するためにそれらを使用するため、純粋な整数を割り当てることは避けてください。