【问题标题】:iOs Play Audio for VOIP AppiOs 为 VOIP 应用播放音频
【发布时间】:2013-07-02 06:09:13
【问题描述】:

这是我在 stackoverflow 上的第一篇文章。目前我正在为 ios 开发一个 voip 应用程序。我想做这样的事情。

//in  a thread
while(callIsOnGoing){
  data = getDataFromNetwork()
  playData()
  sleep(10ms)
}

但问题是 ios 中的音频在“拉”模型中工作(使用回调来获取数据)。但我需要推送数据才能播放它。我已经尝试过 AudioQueue,但是在 audioQueue 中,尽管调用了回调,但我在回调之外推入缓冲区的数据不会被播放。

再次,我看到了苹果(http://developer.apple.com/library/ios/#samplecode/AVCaptureToAudioUnit/Introduction/Intro.html)的 AVCaptureToAudioUnit 示例,他们在音频单元延迟的情况下同步调用 AudioUnitRender。我为 RemoteI/O 音频单元尝试了类似的方法。但每次它返回 OSStatus -50。 代码如下

    //in a separate thread

    do {                                               // 5
      int data_length = [NativeLibraryHelper GetData:(playBuff)];
      if(data_length == 0){

      }else{
        double numberOfFrameCount = data_length / player->audioStreamDesc->mBytesPerFrame;
        currentSampleTime += numberOfFrameCount;

        //AudioUnitRenderActionFlags flags = 0;

        AudioTimeStamp timeStamp;
        memset(&timeStamp, 0, sizeof(AudioTimeStamp));
        timeStamp.mSampleTime = currentSampleTime;
        timeStamp.mFlags |= kAudioTimeStampSampleTimeValid;

        AudioUnitRenderActionFlags flags = 0;
        AudioBuffer buffer;
        buffer.mNumberChannels = player->audioStreamDesc->mChannelsPerFrame;
        buffer.mDataByteSize = data_length;
        buffer.mData = malloc(data_length);
        memcpy(buffer.mData, playBuff, data_length);

        AudioBufferList audBuffList;
        audBuffList.mBuffers[0] = buffer;
        audBuffList.mNumberBuffers = 1;

        printf("Audio REnder call back funciotn called with data size %d\n", data_length);

        status = AudioUnitRender(audioUnitInstance, &flags, &timeStamp, 0, numberOfFrameCount, &audBuffList);
        printf("osstatus %d\n", status);
    }//end if else
    CFRunLoopRunInMode (                           // 6
                        kCFRunLoopDefaultMode,                     // 7
                        0.25,                                      // 8
                        false                                      // 9
                        );
    //} while (aqData.mIsRunning);
    [NSThread sleepForTimeInterval:.05];
}while (player->isRunning == YES);

我在音频播放部分苦苦挣扎了一个多月。请帮忙。提前致谢。

【问题讨论】:

    标签: ios audio core-audio voip audiounit


    【解决方案1】:

    一种通用的解决方案是让异步网络 getdata/read 函数将数据推送到中间缓冲区或队列,然后从该中间缓冲区读取音频回调(如果中间缓冲区/队列为空,则读取静音)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2014-08-17
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多