作者johnlinvc (阿翔)
看板MacDev
标题Re: [问题] iOS播放streaming的audio
时间Mon May 7 22:03:00 2012
※ 引述《chris1000 (矜持)》之铭言:
: 想法是
: 1. 将收到的g.726 raw data解码成raw PCM後
: 2. 再使用audio queue servie去将PCM data enqueue并播放
: 但是後半段播放出来的声音一直是播一小段顿一下的状况
: 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版本的范例可以参考?
https://github.com/michaeltyson/TPCircularBuffer
: 3. didRecieveData是否能设定每次收下来都固定大小而不是浮动的?
不行
: 4. 是否改用NSThread会比dispatch queue好?
不会
: 5. 这种情况改用OpenAL会不会比较快....但是OpenAL好像都拿来作同时播放多个音效?
不会
: 感谢各位看到最後<(_ _)>
你的问题应该是在产生太多AudioQueue了,变成下面这种状况
receive data-> decode -> create AudioQueue -> play
↑ ↓
L_______________________________________↲
应该是要这样才合理 (buffer big enough)
create AudioQueue -> receive data -> decode -> add to buffer --> play
^ |
L________________________↲
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.32.24.155
1F:推 chris1000:感谢您的解答....我来试试看<(_ _)> 05/08 10:51