ios - 如何使用 `AVCapturesession` 中的 `didOutputSampleBuffer` 播放音频缓冲区

标签 ios avfoundation playback avcapturesession

我一直在尝试播放在 didOutputSampleBuffer 委托(delegate)中作为原始数据接收的音频。处理原始数据的正确方法应该是什么?

最佳答案

查看以下来自 Apple 的示例代码:AVCaptureTtoAudioUnitOSX

在那里您可以看到如何正确处理原始音频数据并将其传递给 AudioUnit

基本原理如下:

  1. 获取 SampleBufferAudioStreamBasicDescription 以获取有关格式的信息

    首先使用CMSampleBufferGetFormatDescription获取CMFormatDescriptionRef
    然后使用 CMAudioFormatDescriptionGetStreamBasicDescription 获取 AudioStreamBasicDescription
    现在您可以获得有关采样率、每 channel 位数、每帧 channel 数和每数据包帧数的信息

  2. 获取带有实际音频数据的AudioBufferList

    要么使用 CoreAudio 的公共(public)实用程序,要么检查这个 mailing list输入正确的方法
    该函数称为 CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer。第三个参数是 bufferListOut,它是您想要的 AudioBufferList 并将传递给例如AudioUnit 或您需要的任何东西。

  3. 获取实际的原始数据

    AudioBufferList 包含AudioBuffers,每个包含数据

    struct AudioBuffer {
     UInt32 mNumberChannels;
     UInt32 mDataByteSize;
     void   *mData;
    };
    

这应该让你继续。查看来自 Apple 的示例代码以获取更多信息。

关于ios - 如何使用 `AVCapturesession` 中的 `didOutputSampleBuffer` 播放音频缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13814943/

相关文章:

ios - FBSDKLoginKit,注销完成时如何回调?

iphone - AVPlayerItem replaceCurrentItemWithPlayerItem 阻塞

iphone - 上传或导出大视频会占用内存并导致崩溃...我该如何分解它?

ios - AVFoundation, captureStillImageAsynchronouslyFromConnection 时如何关闭快门声音?

c++ - 使用 QT Creator 在 C++ 中播放视频

javascript - undefined 不是对象(评估 '_react.PropTypes.object' )

ios - 将 iPhone 视频转换为 mp4 并上传到 PHP 服务器

ios - 使用 Swift 2.0 播放 AVPlayer

ios - AVFoundation 在 iPhone 12 上录制 10 位 HDR 视频

html - 有没有办法让 GIF 在鼠标悬停时播放并在鼠标移出时暂停?