Objective-CでNSDataからPCM8bitへの変換方法について
サーバーからソケット通信で受け取った800バイトの音源データ(PCM8bit8khz)を再生したいのですが、現在解決に至っておりません。
AVAudioPlayerのinitWithdataを使えば良いのではと思い以下のコードを動かしてみたのですが、
//関数の呼び出しaudioDataは受け取ったデータ
[self prepareAudio:audioData];
〜
//デリゲートメソッドなど
-(void)prepareAudio:(NSData*)data
{
self.player.delegate = self;
NSError *error = nil;
player = [[AVAudioPlayer alloc] initWithData:data fileTypeHint:AVFileTypeCoreAudioFormat error:&error];
if ( error != nil )
{
NSLog(@"Error %@", [error localizedDescription]);
}
[self.player prepareToPlay];
}
#pragma mark - AVAudioPlayerDelegate
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if ( flag )
{
NSLog(@"Done");
// [self.playButton setTitle:@"Start" forState:UIControlStateNormal];
// Can start next audio?
}
}
Error 操作を完了できませんでした。(OSStatus エラー 1954115647。)
と表示されてします。(どうやらAVAudioで読み込めない形式というエラー?)
AVFileTypeCoreAudioFormatをいろいろ変更してもだめでした。
Androidでは以下のコードで動いているため、
bufSize = AudioTrack.getMinBufferSize(
8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_8BIT);
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
8000, //[Hz]
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_8BIT, //[bit]
bufSize, //[byte]
AudioTrack.MODE_STREAM);
audioTrack.play();
〜〜〜
// soundByteが音声データ
audioTrack.write(soundByte, 0, soundByte.length);
こちら側で変換してやる必要があると思い、Core Audioを用いた変換を試していますが現在試行錯誤している段階です。
http://objective-audio.jp/2008/03/core-audio-audiostreambasicdes.html
https://developer.apple.com/library/mac/documentation/MusicAudio/Reference/AudioConverterServicesReference/#//apple_ref/c/func/AudioConverterNew
AudioStreamBasicDescription wavFormat;
wavFormat.mSampleRate = 8000.0;
wavFormat.mFormatID = kAudioFormatLinearPCM;
wavFormat.mFormatFlags = kAudioFormatFlagIsPacked; //WAVの8bitはunsigned
wavFormat.mBitsPerChannel = 8;
wavFormat.mChannelsPerFrame = 1;
wavFormat.mFramesPerPacket = 1;
wavFormat.mBytesPerFrame = 1;
wavFormat.mBytesPerPacket = 1;
wavFormat.mReserved = 0;
800k8hzなので、上記のようなAudioStreamBasicDescriptionかなと思ってますが、上記をどのように利用するのかでつまずいております。
ご教示いただければ幸いです。
よろしくお願いいたします。