繁体   English   中英

如何使用Audio Queue播放NSData(bytes)?

[英]How to play NSData(bytes) with Audio Queue's?

如何使用音频队列服务播放[NSData字节],从这里开始,这里的字节是AudioFile的令牌,但是我要从互联网下载声音,因此需要使用队列服务播放。 我试过这样的参数:

      memset(&mDataFormat, 0, sizeof(mDataFormat));
audioData = [[NSData alloc]initWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"1" ofType:@"mp3"]];
    UInt32 size = sizeof(mDataFormat.mSampleRate);
    XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareSampleRate, &size,&mDataFormat.mSampleRate), "couldn't get hardware sample rate");
    size = sizeof(mDataFormat.mChannelsPerFrame);
    XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareInputNumberChannels,&size,&mDataFormat.mChannelsPerFrame), "couldn't get input channel count");
    mDataFormat.mFormatID = kAudioFormatLinearPCM;
    if (mDataFormat.mFormatID == kAudioFormatLinearPCM)
    {
        mDataFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
        mDataFormat.mBitsPerChannel = 8;
        mDataFormat.mBytesPerPacket = mDataFormat.mBytesPerFrame = (mDataFormat.mBitsPerChannel / 8) * mDataFormat.mChannelsPerFrame;
        mDataFormat.mFramesPerPacket = 1;
    }



AudioQueueNewOutput(&mDataFormat, AQPlayer::AQBufferCallback, this, CFRunLoopGetCurrent(), kCFRunLoopCommonModes, 0, &mQueue);
UInt32 maxPacketSize;
UInt32 _size = sizeof(maxPacketSize);
AudioFileGetProperty(mAudioFile, kAudioFilePropertyPacketSizeUpperBound, &_size, &maxPacketSize);
UInt32 bufferByteSize = (UInt32)[audioData length];
CalculateBytesForTime (mDataFormat, maxPacketSize, kBufferDurationSeconds, &bufferByteSize, &mNumPacketsToRead);
AudioQueueSetParameter(mQueue, kAudioQueueParam_Volume, 1.0);

回调正常工作,但是很遗憾,不能设置缓冲区中的字节:

if (nPackets > 0) 
{
    inCompleteAQBuffer->mAudioDataByteSize = numBytes;      
    inCompleteAQBuffer->mPacketDescriptionCount = nPackets; 

  for (int i = 0; i < inCompleteAQBuffer->mAudioDataByteSize; i++)
   {
        char * cash = (void *)[THIS->audioData bytes];

       // inCompleteAQBuffer->mUserData[i] = cash[i];

   }

    //inCompleteAQBuffer->mUserData = data;

其中inCompleteAQBuffer是AudioQueueBufferRef类型,请帮助...

您需要知道NSData中包含的音频格式。 标头? 未压缩/原始PCM? 多少位? 字节序? 有多少个频道? 需要采样率(或滤波后的插值率)吗?

如果压缩了数据,则需要将其解压缩为原始音频,或者将音频队列配置为播放适当的压缩格式(如果支持)。

知道格式后,对于未压缩的音频,您可以将指向NSData字节的指针转换为C类型的适当数组或结构的数组(无符号char,short int,short int对等)。 然后将请求数量的样本从数组复制到回调缓冲区。 您的回调还必须跟踪在两次回调之间的先前回调(例如,数组索引)中已经使用了该数组的哪一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM