作者chris1000 (矜持)
看板MacDev
标题[问题] iOS播放streaming的audio
时间Mon May 7 19:42:21 2012
各位好,我是刚接触iOS开发不到3个月的新手
比较正规的课程大概就是看CS 193P 2011的上课影片
其余的部分大多是找辜狗大神补足
最近需要作一个跟IPCAM有关的APP
目前卡在跟音效处理有关的地方orz
我想要把从IPCAM那边接收到 g.726编码的audio stream即时播放出来
想法是
1. 将收到的g.726 raw data解码成raw PCM後
2. 再使用audio queue servie去将PCM data enqueue并播放
前半段已经使用NSUrlConnection didRecieveData+ ffmpeg的g.726完成了
但是後半段播放出来的声音一直是播一小段顿一下的状况
处理的code如下,如果有不清楚的我再将程式码整个放上来
ConnectionRequest.m
-(void) connection:(NSURLConnection *)connection
didRecieveData:(NSData *)data
{
int outDataSize = 0;
void *outDatabuf = malloc(data.length*8);
//将G.726编码的data 解码成raw PCM至outDatabuf
[G726Decoder decodeFrame:data.bytes
withDatasize:data.length
withOutData:outDatabuf
withOutDataSize:&outDataSize];
dispatch_queue_t playQueue = dispatch_queue_create("play", NULL);
dispatch_async(playQueue, ^(void){
playBuffer(outDatabuf, outDataSize);
free(outDatabuf);
});
dispatch_release(playQueue);
}
player.c
void AQCallback(void *in, AudioQueueRef inQ, AudioQueueBufferRef outQB)
{
//将pcm data目前播到的位置开始复制资料到outQB->mAudioData
//使用AudioQueueEnqueueBuffer(inQ, outQB, 0, NULL)来Enqueue
}
int playBuffer(void *pcm, int len)
{
//使用AudioQueueService播放pcm data
//1. 将AudioStreamBasicDescription初始化
//2. 使用AudioQueueNewOutput建立一个outputQueue,
// callback为AQCallback()
//3. 使用AudioQueueAllocateBuffer来建立3个buffer
//4. call 1次AQCallback()来Enqueue
//5. 使用AudioQueueStart开始播放
//6. 用一个while loop卡住直到pcm被播放完毕
}
後面player的部分我有试过直接播一个已经存档的PCM raw data
可以很顺利的播完
但是拿来播stream就变成播一下顿一下播一下顿一下
目前didRecieveData收到的data size大约是1000~2000不等
解完码後的PCM大小是四倍,大约是4000~8000不等
请问
1. 是否需要将PCM raw data先丢到一个buffer,
等待累积到一定程度以後再丢去player播放?
2. 如果需要一个buffer来处理read/write,那麽这个buffer大小应该要多大比较好?
这种buffer management有没有iOS版本的范例可以参考?
3. didRecieveData是否能设定每次收下来都固定大小而不是浮动的?
4. 是否改用NSThread会比dispatch queue好?
5. 这种情况改用OpenAL会不会比较快....但是OpenAL好像都拿来作同时播放多个音效?
感谢各位看到最後<(_ _)>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.216.168.86