2012-01-27 6 views
2

numberOfLoopsプロパティを-1に設定して、AVAudioPlayerでループ音を再生しています。そして私は、プログラムループレートを制御したいので、私はこのように私のオーディオデータをロードしています:AVAudioPlayerがデータの最後に到達する前に、AVAudioPlayerの再生を停止するにはどうすればよいですか?

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Click" ofType:@"aif"]; 
NSMutableData *soundData = [NSMutableData dataWithContentsOfFile:soundFilePath]; 

をし、その後、オーディオプレーヤーを初期化する前にその長さを変える:

int loopDuration = .5; // seconds 
int desiredDataLength = loopDuration * 2 * 44100; // this assumes 16-bit mono data 
[soundData setLength:desiredDataLength]; 
NSLog(@"data: %@", soundData); // this shows the data after our length change 
AVAudioPlayer soundPlayer = [[AVAudioPlayer alloc] initWithData:soundData error:NULL]; 
soundPlayer.numberOfLoops = -1; 
[soundPlayer play]; 

場合、これは完璧に動作します元のファイルの長さよりも短いloopDurationを設定します。余分なデータは切り捨てられ、ループは希望の速度で再生されます。しかし、元のファイルより長いloopDurationを設定した場合、ループはあまりにも速く再生されます。各反復は、元のファイルの存続期間だけ持続します。

NSLogの行から、soundDataが正しい長さにパディングされていることを確認できます。私は多分AVAudioPlayerは、データに末尾の0を無視して、それがすべてのそれらの0年代を見たときにループを再起動すると思ったので、代わりに、単にデータ長を設定するので、私はいくつかの値でそれをパディング試してみました:

NSData *filler = [@"1234" dataUsingEncoding:NSASCIIStringEncoding]; 
while (desiredDataLength > [soundData length]) { 
    [soundData appendData:filler]; 
} 

しかし、ループ元のファイルデータが停止した時点で再開します。健全性チェックとして、私は4にnumberOfLoopsを設定し、データを再生し、その後...サウンドデータを倍増

[soundData appendData:soundData]; 

を試してみました...と。私はその音を8回聞くことを期待していましたが、私はそれが4回しか聞こえなかったのです!しかし、私がsoundDataをログすると、その長さが倍増していることがわかります。

ループのメカニズムには何らかの情報が組み込まれているため、ループの再起動がデータの終わりになるのではなく、再開されるようです。誰が本当に何が起こっているのかについての洞察を持っていますし、私の望む結果を得るためにそれを回避する方法はありますか?

更新:元のサウンドファイルをオーディオエディタで開き、最後に無音を追加すると、最も遅いループスピードで十分に長くするために、AVAudioPlayerで処理していることがわかりました。しかし、NSLogの出力を見ると、このデータもすべて0で終わることがわかります。 AVAudioPlayerは、オーディオエディタで追加した無音部分を尊重しますが、プログラムでデータを埋めて追加した無音部分を尊重するのはなぜですか?

答えて

0

サウンドデータは単なるデータではありません。内容の長さを定義するヘッダーも含まれているAIFファイルです。 AVAudioPlayerは明らかにあなたのバッファの長さではなく、ヘッダーを見ています。

+0

これは意味があり、私が見た振る舞いに合っています。私はここでAIFFヘッダーの説明を見つけました:http://www-mmsp.ece.mcgill.ca/documents/audioformats/aiff/Docs/AIFF-C.9.26.91.pdf。私は、データ自体を操作するときにサイズ値を操作する方法を理解する必要があります。私はこれが起こっていると仮定します。 – arlomedia

関連する問題