2015-10-04 6 views
7

両方のオーディオサンプルのバイトを加算するだけで、2つの異なるオーディオサンプルを1つにミキシングする際に問題が発生します。MP3ファイルから2つのオーディオサンプルを合成する

それが言う私は、メディアプレーヤーでmixed.mp3ファイルを開こうとすると、プロセス下記後:ファイルを再生しながら

のWindows Media Playerの問題が発生しました。ここで

私はオーディオファイルをミックスするために使用しているコードです:

byte[] bytes1,bytes2,final; 
int length1,length2,max; 

// Getting byte[] of audio file 
using (BinaryReader b = new BinaryReader(File.Open("background.mp3" , FileMode.Open))) 
{ 
    length1 = (int)b.BaseStream.Length; 
    bytes1 = b.ReadBytes(length1); 
} 

using (BinaryReader b = new BinaryReader(File.Open("voice.mp3" , FileMode.Open))) 
{ 
    length2 = (int)b.BaseStream.Length; 
    bytes2 = b.ReadBytes(length2); 
} 

// Getting max length 
if(length1 > length2){ 
    max = length1; 
}else{ 
    max = length2; 
} 

// Initializing output byte[] of max length 
final = new byte[max]; 

// Adding byte1 and byte2 and copying into final 
for (int i=0;i<max;i++) 
{ 
    byte b1 , b2; 

    if(i < length1){ 
     b1 = bytes1[i]; 
    }else{ 
     b1 = 0; 
    } 

    if (i < length2){ 
     b2 = bytes2[i]; 
    } 
    else{ 
     b2 = 0; 
    } 

    final[i] = (byte)(b1 + b2); 
} 

// Writing final[] as an mp3 file 
File.WriteAllBytes("mixed.mp3" , final); 

注:私は2つの同じファイルをミックスしようとしましたが、それが働いていた、つまり、メディアプレーヤーがスローされませんでしたエラーが発生して正しく再生されました。

+0

あなたのボトムノートはどういう意味ですか?あなたは今コードが動作することを意味しますか? –

+5

これはできません。 Mp3は行波データではありません。そのようなバイトを追加すると、100%データが破損します。それがあなたのためにどのように働いたかはわかりません。 –

+6

デコードして計算し、作物を念頭に置いて(0..255)、再度エンコードします。あなたが今行っていることは、mp3が圧縮されているため(振幅データを含んでいない限り)、ファイルレベルで作業するときに変更してはいけないすべてのメタデータでヘッダーを考慮する必要があります。 –

答えて

8

これは、のMP3ファイルの前に、のものが混在している可能性が高いためです。 そしてあなたはサンプルを一緒に「ちょうど追加」しています。結果はclippingになります。最初にlibraryを使用してMP3ファイルをPCMにデコードしてから、それらをミックスする必要があります。

は正しくあなたがやるべきサンプルを混合する:

final[i] = (byte)(b1/2 + b2/2); 

は、そうでなければ、あなたの計算がオーバーフローします(また、私は一般的にそれらを操作する前に、 float秒にあなたのオーディオを正規化するお勧めします)。 すべてのMP3ファイルのバイトを混合している、つまり、ヘッダーが混乱していることに注意してください(WMPはあなたの「Mixed」ファイルを再生することを拒否しています)。ファイル全体ではなく、ファイルの実際のオーディオデータ(サンプル)のみをミックスする必要があります。

// You can get the library via NuGet if preferred. 
using NAudio.Wave; 

... 

var fileA = new AudioFileReader("Input path 1"); 

// Calculate our buffer size, since we're normalizing our samples to floats 
// we'll need to account for that by dividing the file's audio byte count 
// by its bit depth/8. 
var bufferA = new float[fileA.Length/(fileA.WaveFormat.BitsPerSample/8)]; 

// Now let's populate our buffer with samples. 
fileA.Read(bufferA, 0, bufferA.Length); 

// Do it all over again for the other file. 
var fileB = new AudioFileReader("Input path 2"); 
var bufferB = new float[fileB.Length/(fileB.WaveFormat.BitsPerSample/8)]; 
fileB.Read(bufferB, 0, bufferB.Length); 

// Calculate the largest file (simpler than using an 'if'). 
var maxLen = (long)Math.Max(bufferA.Length, bufferB.Length); 
var final = new byte[maxLen]; 

// For now, we'll just save our mixed data to a wav file. 
// (Things can get a little complicated when encoding to MP3.) 
using (var writer = new WaveFileWriter("Output path", fileA.WaveFormat)) 
{ 
    for (var i = 0; i < maxLen; i++) 
    { 
     float a, b; 

     if (i < bufferA.Length) 
     { 
      // Reduce the amplitude of the sample by 2 
      // to avoid clipping. 
      a = bufferA[i]/2; 
     } 
     else 
     { 
      a = 0; 
     } 

     if (i < bufferB.Length) 
     { 
      b = bufferB[i]/2; 
     } 
     else 
     { 
      b = 0; 
     } 

     writer.WriteSample(a + b); 
    } 
} 

:私はNAudioライブラリを(それがさらに合併症を避けるために、wavファイルに混合されたオーディオをエクスポート)を使用して、(コメント)実施例を提供してきました

入力ファイルは、正しく動作するためには、同じサンプルレート、ビット深度、およびチャンネル数でなければなりません。

関連する問題