2012-03-29 14 views
1

操作後のオーディオデータの再生に問題があります。 私が使用する唯一のAPIは、Linux(Ubuntu)のC言語でのalsa lib APIです。 read()とbuffer1を使用して、unsigned char配列(buffer1)で16ビット整数ウェーブファイルからデータを取得します。 。私は、同じサイズの別のunsigned char配列(buffer2)にデータを渡したい。私がbuffer2 [i] = buffer1 [i]でループを作成すると、それはうまくいきます:buffer2を正しく再生することができます。しかし、データを操作するために、フロート配列に変換してからunsigned charに変換します(これまではオーディオデータを操作しませんでしたが、浮動小数点に変換してから、unsigned charに戻して動作をテストします)。しかし、今はbuffer2はサウンドを生成しませんが、その値はすべてbuffer1の値と厳密に同じです(私はbuffer1とbuffer2の多くの値のprintfを作成しました;それらはすべて同じです)...私がしたのは、逆の場合もあります。操作されたオーディオデータ(符号なしの文字)は再生できません

何が問題なのですか?

ビクター

答えて

0

バッファー1とバッファー2の値は同じであっても動作しません。おそらくprintfコマンドで使用する書式設定は、差異(%i、%fなど)をマスクすることです。 printfを使用するのではなく、ブレークポイントを設定し、デバッガを使用して値を調べてみてください。これは実際に間違っていることを明らかにするのに役立ちます。

EDIT:

あなたはキャストを実行方法についてのご意見を考えると、私は今助けることができると思います。入ってくる生データはunsigned char型です。ほとんどのプラットフォームでは、0〜255の整数値になります。この値を浮動小数点数に変換して操作したいとします。データを任意の操作のための浮動小数点型として意味のあるものにするには、この範囲を+/- 1.0の間で拡大/縮小する必要があります。次のコードでは、これが "スケール"変数の値です。

#include <iostream> 
#include <math.h> 

int main() 
{ 

    const int BUFFER_LEN = 6; 
    const unsigned char channelDataIN[] = {0,255, 1, 254, 2, 253}; 

    unsigned char channelDataOUT[BUFFER_LEN]; 
    float channelDataF[BUFFER_LEN]; 

    std::cout.precision(5); 

    float scale = powf(2.f, 8.f*sizeof(unsigned char)) - 1.f; 


    for (int mm = 0; mm < BUFFER_LEN; ++mm) 
    {   
     std::cout << "Original = " << (int)channelDataIN[mm] << std::endl; 

     channelDataF[mm] = (float)(channelDataIN[mm]) * 2.f/scale - 1.f; //Float cast 
     std::cout << "Float conversion = " << channelDataF[mm] << std::endl; 

     channelDataOUT[mm] = (unsigned char) ceil( (1.f+channelDataF[mm]) * scale/2.f ); 
     std::cout << "Recovered = " << (int)channelDataOUT[mm] << std::endl; 

     if (channelDataIN[mm] == channelDataOUT[mm]) 
      std::cout << "The output precisely equals the input" << std::endl << std::endl; 
     else 
      std::cout << "The output != input" << std::endl << std::endl; 
    } 

    return 0; 
} 

値を戻した後の符号なし文字の出力配列は、入力配列と同じです。これはコードからの出力です。 。 。

Original = 0 
Float conversion = -1 
Recovered = 0 
The output precisely equals the input 

Original = 255 
Float conversion = 1 
Recovered = 255 
The output precisely equals the input 

Original = 1 
Float conversion = -0.99216 
Recovered = 1 
The output precisely equals the input 

Original = 254 
Float conversion = 0.99216 
Recovered = 254 
The output precisely equals the input 

Original = 2 
Float conversion = -0.98431 
Recovered = 2 
The output precisely equals the input 

Original = 253 
Float conversion = 0.98431 
Recovered = 253 
The output precisely equals the input 
+0

こんにちは、ありがとうございます。私は古典的な形でキャストを行います:for(i = 0; i victor

+0

buffer1 [i]とbuffer [2]の値を比較すると、equalではありません(buffer2 [i]はbuffer2 [i]よりも大きい) – victor

関連する問題