9

以下のコードを使用して、2 つの MP3 ファイルを連結しようとしました。前半(完全な最初のファイル)を再生できる新しいファイルを取得しましたが、後半は無音です。新しいファイルの長さは正しかった。私は何を間違っていますか?

List<Byte[]> files = new List<byte[]>();
var tempfile = File.ReadAllBytes(Path.Combine(path, "1.mp3"));
files.Add(tempfile);
tempfile = File.ReadAllBytes(Path.Combine(path, "2.mp3"));
files.Add(tempfile);
Byte[] a=new Byte[files[0].Length+files[1].Length];
Array.Copy(files[0], a, files[0].Length);
Array.Copy(files[1], a, files[1].Length);

File.WriteAllBytes(Path.Combine(path, "3.mp3") , a);
4

6 に答える 6

15

2 番目の曲だけを聞いているに違いありません。(そして、両方のファイルが同じ長さであるか、最初のファイルが短い)

2 番目のソング データを 1 番目のソング データの上にコピーしています。また、MP3 データはストリーミングされるため、ビットレートを気にせずにファイルを相互に追加することができます (エラーが発生する可能性があります)。ビットレートは自動的に調整されます。

MP3 フレーム ヘッダーの詳細

... これを試して...

Array.Copy(files[0], 0, a, 0, files[0].Length);
Array.Copy(files[1], 0, a, files[0].Length, files[1].Length);

...またはさらに良い...

using (var fs = File.OpenWrite(Path.Combine(path, "3.mp3")))
{
    var buffer = File.ReadAllBytes(Path.Combine(path, "1.mp3"));
    fs.Write(buffer, 0, buffer.Length);
    buffer = File.ReadAllBytes(Path.Combine(path, "2.mp3"));
    fs.Write(buffer, 0, buffer.Length);
    fs.Flush();
}
于 2009-09-21T18:02:30.060 に答える
6

単純:

public static void Combine(string[] mp3Files, string mp3OuputFile)
{
    using (var w = new  BinaryWriter(File.Create(mp3OuputFile)))
    {
        new List<string>(mp3Files).ForEach(f => w.Write(File.ReadAllBytes(f)));
    }
}
于 2015-01-17T22:06:26.943 に答える
3

NAudioを使用してMP3ファイルを連結する方法は次のとおりです。

public static void Combine(string[] inputFiles, Stream output)
{
    foreach (string file in inputFiles)
    {
        Mp3FileReader reader = new Mp3FileReader(file);
        if ((output.Position == 0) && (reader.Id3v2Tag != null))
        {
            output.Write(reader.Id3v2Tag.RawData,
                         0,
                         reader.Id3v2Tag.RawData.Length);
        }
        Mp3Frame frame;
        while ((frame = reader.ReadNextFrame()) != null)
        {
            output.Write(frame.RawData, 0, frame.RawData.Length);
        }
    }
}

詳細については、こちらをご覧ください。

于 2010-11-08T18:42:31.233 に答える
2

各 MP3 ファイルには、曲のメタデータを含むファイルの先頭にヘッダーがあります。少なくとも、2 番目のファイルではそれを削除する必要があります。

これは以前のスタック オーバーフローの質問です。C# で MP3 ファイルをマージ/結合するにはどうすればよいですか? .

Read MP3 Tag Information (ID3v1 and ID3v2)への別のリンクを次に示します。削除に役立つ場合があります。

于 2009-09-21T17:55:36.953 に答える
2

この質問は、以前にここここで尋ねられました。C# での MP3 ヘッダーの読み取りも参照してください。ただし、ヘッダーを読み取る代わりに、それを取り除き、残りを連結してから、連結されたファイルの新しいヘッダーを生成します。

編集:さらに読んだ後、ID3タグを削除せずにファイルを連結するだけでは、違いはないようです。しかし、最初にそれらを取り除くことはまだ良い考えのようです.

于 2009-09-21T18:03:17.000 に答える