1

オーディオ キュー サービスで [NSData バイト] を再生する方法、speakHere の例から、バイトは 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 タイプです。助けてください ...

4

1 に答える 1

1

NSData に含まれるオーディオの形式を知る必要があります。ヘッダ?非圧縮/生の PCM? 何ビット?エンディアンネス?チャンネル数は?サンプルレート (またはフィルタリングされた補間レート) が必要ですか?

データが圧縮されている場合は、生のオーディオに圧縮解除するか、サポートされている場合は適切な圧縮形式を再生するように Audio Queue を構成する必要があります。

圧縮されていないオーディオの形式がわかったら、NSData バイトへのポインターを適切な配列または構造 C 型の配列 (unsigned char、short int、short int のペアなど) にキャストできます。次に、要求された数のサンプルを配列からコールバック バッファーにコピーします。また、コールバックは、この配列のどの部分が以前のコールバックで既に使用されているか (配列インデックスなど) をコールバック間で追跡する必要があります。

于 2011-11-17T00:54:52.503 に答える