作者ryanliang (暑假闲闲的大学生~~)
看板MacDev
标题Re: [问题] 请问iPhone有办法将接收道的声音直接放 …
时间Mon Jan 10 13:39:13 2011
※ 引述《ryanliang (暑假闲闲的大学生~~)》之铭言:
: ※ 引述《ryanliang (暑假闲闲的大学生~~)》之铭言:
: : 那我懂了,memcpy把inBuffer里的资料丢到output buffer里去,这样
: : 一来,inBuffer里就没有data了,所以要让它回到inAQ去排队等,然
: : 後下一个满的inBuffer再进来,一直循环。
: : 原来是这麽回事,感谢zonble大!!!!
: 事隔已久,借个标题再问一下。
: 前情题要一下,之前设定的Audio格式是Linear PCM,将未压缩的资料丢进
: 三个Buffer中,之後再透过OutputBufferHandler把装满的Buffer拿去倒,
: 大致上是这样。
: 现在遇到了一个问题。我将Audio的格式及参数改成AAC的格式及参数後,
: OutputBufferHandler就不会work了。
: 我先写了一个小的测试程式用同样的方法,去做录音的动作。
: 但我把OutputBufferHandler给拿掉,直接在InputBufferHandler里面把资料
: 用AudioFileWritePackets写到档案里去也是可以work,而我写入档案的格式
: 是用AAC编码,也是可以顺利存成AAC的档案。
: 这证明了Audio Queue Services是可以做Audio Encode的,我纳闷的是为什
: 麽换了格式,OutputBufferHandler就不会动作了?
: 希望板上先进给我一点意见
: 谢谢~~
感谢zonble大,根据我这几天的小小研究,目前有了一点点的心得
我自己上来回一下,供大家参考,有错误的地方还请多多指正.
首先,Audio Queue Services有提供完整的Codec可以使用,主要是
经过AudioQueueNewInput及AudioQueueNewOutput两个Method在控制
Recording跟Playback.
AudioQueueNewInput主要负责的事,就是设定好InputHandler的参数.
而InputHandler则是Recording的Callback,主要就是负责将
Audio Data从Queue里面拿出来,再用AudioFileWritePackets这个方法
将Audio Data写进你预先设好的File中.
而AudioQueueNewOutput则是负责播放(Playback)这档事.
它的过程刚好与AudioQueueNewInput相反,它是经由Callback
(OutputHandler)将档案读进Buffer(使用AudioFileReadPackets方法)
,再经过Codec解码成LinearPCM,最後再播出来.
根据APPLE的官方文件,它有件事情没有说得很清楚,那就是"是不是它
播放只能接受LinearPCM的格式来输出声音,而不接受其他格式(如:AAC)
的格式输出",就目前我是出来的结果,是只能用LinearPCM格式播放声音
,若设定其他格式(如:AAC或有压缩的格式),OutputHandler都不会动作.
Google出来结果,也大都是从网路上的MP3档Streamming到电脑上拨出来
,而它拨出来的格式也是经由Codec转成LinearPCM的格式播出,好几个例
子都是如此,也没有找的其他的应用.
参考资料:
http://tinyurl.com/26sxtwu
这是我目前测试的结果,如果有错,请版上先进给我一些建议.
谢谢~~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.219.177.46
1F:推 sinread:ryanliang同学, 我怎麽觉得我们两个在写类似的东西XD 01/10 14:39
2F:→ sinread:我目前播出来的也只有LPCM~ 01/10 14:41
3F:→ sinread:补充: AQ是跟着run loop在跑的 01/10 14:42
4F:→ ryanliang:跟着Run Loop再跑是甚麽意思?? 有点不大懂@@ 01/10 15:23
5F:推 sinread:AudioQueueNewOutput 有一个参数要填 cfrunloop~ 这里 01/10 17:08
6F:→ sinread:如果发现ui和audio会抢资源的话, 去开一个thread, 01/10 17:09
7F:→ sinread:填 cfrunloopgetcurrent, 刚好看到乱入一下XD 01/10 17:10