HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 设置音频单元格式并渲染交错PCM音频的回调大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试播放我在一系列UDP数据包中收到的音频.它们被解码为具有以下@L_616_0@的PCM帧:

> 2个频道
>交错
单个通道中每个样本> 2个字节(所以4
每帧字节数)
>采样率为48000.

每个UDP数据包包含480个帧,因此缓冲区的大小为480 * 2(通道)* 2(每个通道的字节数).

我需要设置@L_618_1@音频单元来播放这些数据包.所以,我的第@L_618_1@问题是,我应该如何为音频单元设置AudioStreamBasicDescription结构?查看文档我甚至不确定交错PCM是否是可接受的格式.

这是我到目前为止所得到的:

struct AudioStreamBasicDescription {
   Float64 mSampleRate;                 //48000
   UInt32  mFormatID;                   //?????
   UInt32  mFormatFlags;                //?????
   UInt32  mBytesPerPacket;             //Not sure what "packet" means here
   UInt32  mFramesPerPacket;            //Same as above
   UInt32  mBytesPerFrame;              //Same
   UInt32  mChAnnelsPerFrame;           //2?
   UInt32  mBitsPerChAnnel;             //16?
   UInt32  mReserved;                   //???
};
typedef struct AudioStreamBasicDescription  AudioStreamBasicDescription;

其次,在设置之后,我不确定如何将帧从UDP回调到实际的音频单元渲染功能.

我目前有@L_618_1@来自套接字监听器的回调函数,我在其中生成包含我想要播放的音频的int16 *缓冲区.据我了解,我还必须为以下形式的音频单元实现渲染回调:

OSStatus RenderFrames(
    void                        *inRefCon,AudioUnitRenderActionFlags  *ioActionFlags,const Audiotimestamp        *intimestamp,UInt32                      inBusnumber,UInt32                      innumberFrames,AudioBufferList             *ioData)
{
    //No idea what I should do here.
    return noErr;
}

总而言之,我认为我的套接字接收回调应该做的是解码帧,并将它们放在缓冲结构中,以便RenderFrames回调可以从该缓冲区中获取帧,并播放它们.它是否正确?如果是,一旦我在RenderFrames函数获取下一帧,我如何实际“提交它”进行播放?

解决方法

一次拿这个部分

AudioStreamBasicDescriptor

Apple的ASBD文档是here.澄清:

>音频帧是一组时间重合的音频样本.换句话说,每个通道@L_618_1@样本.因此,对于立体声,这是2.
>对于PCM格式,没有数据包.据说,mBytesPerPacket = mBytesPerFrame,mFramesPerPacket = 1,但我不确定这是否真的被使用过.
>未使用mReserved且必须为0
>有关mFormatID和mFormatFlags,请参阅The documentation. CoreAudioTypes.h中有@L_618_1@方便的辅助函数CalculateLPCMFlags,用于在CoreAudioTypes.h中计算后者.
>多声道音频通常是交错的(如果你真的不想要它,你可以在mFormatFlags中设置@L_618_1@位).
>还有另@L_618_1@辅助函数可以填充整个ASBD – FillOutASBDForLPCM()用于线性PCM的常见情况.
> remoteIO单元@L_902_31@mFormatID和mFormatFlags的大量组合 – 我发现在iOS上需要进行实验.

这是我的@L_618_1@项目的一些工作代码

AudioStreamBasicDescription inputASBL = {0}; 

inputASBl.mSampleRate =          static_cast<Float64>(sampleRatE);
inputASBl.mFormatID =            kAudioFormatLinearPCM;
inputASBl.mFormatFlags =         kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger,inputASBl.mFramesPerPacket =     1;
inputASBl.mChAnnelsPerFrame =    2;
inputASBl.mBitsPerChAnnel =      sizeof(short) * 8;
inputASBl.mBytesPerPacket =      sizeof(short) * 2;
inputASBl.mBytesPerFrame =       sizeof(short) * 2;
inputASBl.mReserved =            0;

渲染回调

CoreAudio运行Apple所说的拉模型.也就是说,当CoreAudio需要缓冲区填充时,渲染回调被称为实时线程.根据您的问题,您似乎期待相反的情况 – 将数据推送到音频输出.

基本上有两种实现选择:

>在渲染回调中从UDP套接字执行非阻塞读取(作为一般规则,您在此处执行的任何操作都应该是快速且无阻塞的).
>在渲染回调接收和使用时,保持插入样本的音频FIFO.

第二种可能是更好的选择,但是您需要自己管理缓冲区过度和欠量运行.

ioData参数指向分散 – 聚集控制结构.在最简单的情况下,它指向@L_618_1@包含所有帧的缓冲区,但可以包含几个在它们之间具有足够帧以满足innumberFrames的帧.通常,@L_618_1@预分配足够大的缓冲区用于innumberFrames,将样本复制到其中,然后修改指向buy ioData指向它的AudioBufferList对象.

在您的应用程序中,您可能会对解码后的音频数据包采用分散 – 聚集方法,在解码时分配缓冲区.但是,您并不总是得到所需的延迟,并且可能无法安排innumberFrames与解码的UDP音频帧相同.

大佬总结

以上是大佬教程为你收集整理的ios – 设置音频单元格式并渲染交错PCM音频的回调全部内容,希望文章能够帮你解决ios – 设置音频单元格式并渲染交错PCM音频的回调所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。