将 AudioBufferList 转换为 CMSampleBuffer 会产生意外结果

2024-01-23

我正在尝试转换AudioBufferList我从音频单元得到的CMSampleBuffer我可以传递到AVAssetWriter保存麦克风中的音频。这种转换有效,因为我为执行转换而进行的调用不会失败,但记录最终会失败,并且我在日志中看到一些输出似乎引起了关注。

我正在使用的代码如下所示:

- (void)handleAudioSamples:(AudioBufferList*)samples numSamples:(UInt32)numSamples hostTime:(UInt64)hostTime {
    // Create a CMSampleBufferRef from the list of samples, which we'll own
    AudioStreamBasicDescription monoStreamFormat;
    memset(&monoStreamFormat, 0, sizeof(monoStreamFormat));
    monoStreamFormat.mSampleRate = 48000;
    monoStreamFormat.mFormatID = kAudioFormatLinearPCM;
    monoStreamFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsNonInterleaved;
    monoStreamFormat.mBytesPerPacket = 2;
    monoStreamFormat.mFramesPerPacket = 1;
    monoStreamFormat.mBytesPerFrame = 2;
    monoStreamFormat.mChannelsPerFrame = 1;
    monoStreamFormat.mBitsPerChannel = 16;

    CMFormatDescriptionRef format = NULL;
    OSStatus status = CMAudioFormatDescriptionCreate(kCFAllocatorDefault, &monoStreamFormat, 0, NULL, 0, NULL, NULL, &format);
    if (status != noErr) {
        // really shouldn't happen
        return;
    }

    CMSampleTimingInfo timing = { CMTimeMake(1, 48000), kCMTimeZero, kCMTimeInvalid };

    CMSampleBufferRef sampleBuffer = NULL;
    status = CMSampleBufferCreate(kCFAllocatorDefault, NULL, false, NULL, NULL, format, numSamples, 1, &timing, 0, NULL, &sampleBuffer);
    if (status != noErr) {
        // couldn't create the sample buffer
        PTKLogError(@"Failed to create sample buffer");
        CFRelease(format);
      return;
    }

    // add the samples to the buffer
    status = CMSampleBufferSetDataBufferFromAudioBufferList(sampleBuffer,
                                                            kCFAllocatorDefault,
                                                            kCFAllocatorDefault,
                                                            0,
                                                            samples);
    if (status != noErr) {
        PTKLogError(@"Failed to add samples to sample buffer");
        CFRelease(sampleBuffer);
        CFRelease(format);
        return;
    }

    NSLog(@"Original sample buf size: %ld for %d samples from %d buffers, first buffer has size %d", CMSampleBufferGetTotalSampleSize(sampleBuffer), numSamples, samples->mNumberBuffers, samples->mBuffers[0].mDataByteSize);
    NSLog(@"Original sample buf has %ld samples", CMSampleBufferGetNumSamples(sampleBuffer));

正如我提到的,代码本身似乎并没有失败,但是AVAssetWriter不喜欢它,并且CMSampleBuffer基于以下事实,我正在创建的日志条目的大小似乎为 0:

2015-07-09 19:34:00.710 xxxx[1481:271334] Original sample buf size: 0 for 1024 samples from 1 buffers, first buffer has size 2048
2015-07-09 19:34:00.710 xxxx[1481:271334] Original sample buf has 1024 samples

奇怪的是,样本缓冲区报告它有 1024 个样本,但大小为 0。原始 AudioBufferList 有 2048 字节数据,这是我对 1024 个 2 字节样本的期望。

我在初始化和填充的方式方面做错了什么吗?CMSampleBuffer?


事实证明,样本量返回为 0 的事实是一个转移注意力的事实。一旦我清理了一些东西——值得注意的是,我正确设置了时间戳,如下所示:

uint64_t timeNS = (uint64_t)(hostTime * _hostTimeToNSFactor);
CMTime presentationTime = CMTimeMake(timeNS, 1000000000);
CMSampleTimingInfo timing = { CMTimeMake(1, 48000), presentationTime, kCMTimeInvalid };

录音开始工作。

因此,如果其他人因报告的 0 样本缓冲区大小而感到困惑,请注意这是可以的,至少在您将数据输入到AVAssetWriter.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 AudioBufferList 转换为 CMSampleBuffer 会产生意外结果 的相关文章

  • Google Cardboard - Cardboard VR 套件有 iPhone / iOS 入门项目吗?

    我正在看Google Cardboard 套件 一种廉价的 VR 设置 https developers google com cardboard 使用 Android 设备玩 3d VR 游戏 我看到他们有一个 Android 演示项目
  • 有没有办法从 Instruments (Xcode) 的命令行实例中删除授权提示?

    我目前正在通过 bash 脚本使用 Instruments 来启动命令行界面以启动自动化插件的运行 在 4 2 中 这工作得很好 但是随着升级到 Xcode 4 3 我现在被提示需要授权用户 分析其他进程 即使授予了正确的凭据 也不会真正对
  • SpriteKit - 对多个 SKNode 上运行的多个 SKAction 进行排序

    我非常了解 SKAction API 但在多个节点上运行顺序代码时我无法获得良好的代码 这是示例代码 简化 import SpriteKit class GameScene SKScene weak var node1 SKNode wea
  • SwiftUI 检测用户何时截取屏幕截图或屏幕录制

    On UIViewController我们可以轻松地将观察者添加到控制器 喜欢 class ViewController UIViewController override func viewDidLoad super viewDidLoa
  • Draggable Boxview 不更新 Xamarin

    我的第一个问题是框视图生成在左上角 而不是我指定的设计网格第 10 行和网格第 3 列 第二个问题在于可拖动视图 在代码本地可拖动视图的第一部分中 它正确地调用了触摸事件 但也许它没有在GUI中更新
  • “EXC_BAD_ACCESS”与“分段错误”。两者实际上相同吗?

    在我的前几个虚拟应用程序 用于学习时练习 中 我遇到了很多EXC BAD ACCESS 这以某种方式告诉我错误访问是 您正在触摸 访问一个不应该的对象 因为它尚未分配或释放 或者只是您无权访问它 查看此示例代码 该代码存在访问错误问题 因为
  • 在音频文件中查找音频样本(频谱图已存在)

    我正在努力实现以下目标 使用 Skype 拨打我的邮箱 有效 输入密码并告诉邮箱我要录制新的欢迎信息 有效 现在 我的邮箱告诉我在嘟嘟声后录制新的欢迎消息 我想等待蜂鸣声然后播放新消息 不起作用 我如何尝试实现最后一点 使用 FFT 和滑动
  • 在 iOS Safari 上滚动后锚点失去点击能力

    使用它来获取点击次数 nav li a click function event event preventDefault target this attr href replace goToByScroll target 这是滚动功能 f
  • 获取 .wav 文件长度或持续时间

    我正在寻找一种方法来找出 python 中音频文件 wav 的持续时间 到目前为止我已经了解了 pythonwave图书馆 mutagen pymedia pymad我无法获取 wav 文件的持续时间 Pymad给了我持续时间 但它不一致
  • 在两个可移动 uiview 之间画线

    我有一个带有节点的 滚动视图 UIViews 可以拖动 我正在尝试在选定的之间绘制边缘UIViews使用 calayer 但我不知道当视图位置发生变化时如何重新绘制线条 In my viewControllerI 类在节点数组中添加第一个和
  • 在后台运行 URL 请求

    我想在一定的时间间隔内发出 url 请求 例如 每 10 分钟应用程序应该发出一次 url 调用并获取一些 json 数据 应用程序在后台运行时应该能够执行此操作 这可以做到吗 如果是这样 这是否违反 Apple 服务条款 有什么限制吗 i
  • 是否可以通过 Android 应用程序来录音?

    我是一名开发人员 希望创建一个 Android 应用程序来记录电话 这是出于我个人的需要 为了我自己的目的和记录而记录电话 是否有可能做到这一点 是否可以访问麦克风以及通过扬声器发出的声音 我对 Android 开发有点陌生 所以请耐心等待
  • 增量后清除推送通知徽章

    我正在研究 iPhone 中的推送通知 当我收到推送通知时 它在我的应用程序图标上显示 1 下次显示 2 3 4 如果我打开应用程序 它是 0 下次它应该是 1 2 3 4 但它显示最后一个数字和 1 我想在打开应用程序后重置推送通知徽章
  • 视频中的图像/文本叠加 swift

    我正在使用 swift 在视频中使用图像叠加来实现水印效果 我正在使用AVFoundation为此 但不知何故我没有成功 以下是我的覆盖图像 文本的代码 let path NSBundle mainBundle pathForResourc
  • 如何在 iOS 应用程序中检测所有可用的 Wifi 网络并连接到其中之一

    在我的 iOS 应用程序中 我想检测所有可用的 wifi 网络 然后从列表中选择一个网络并连接到它 目标是不打开应用程序内置的设置来连接 Wi Fi 而是在我的应用程序中完成这一切 首先 这可能吗 如果可能的话 请指出要使用哪些框架和方法
  • 使用 UIWebView 显示 PDF 不起作用

    因此 我意识到有关使用 UIWebView 在应用程序 在 iPad 上 中显示 PDF 存在很多问题 我已经审查了我能找到的所有内容 但似乎找不到任何满意的东西 我想做的事情非常基本 所以我真的不知道为什么它不起作用 我需要做的就是在 U
  • admob ios7错误音频框架

    我正在将 admob SDK 当前的 集成到我的上一个应用程序 IOS7 Xcode5 中 并且出现了一个新错误 在新项目上也是如此 我想我错过了一些东西 但我多次重新启动该过程 但错误仍然存 在 Undefined symbols for
  • 如何将NSTextView的格式化内容转换为字符串

    我需要将 NSTextView 的内容从 Mac 应用程序传输到 iOS 应用程序 我使用 XML 作为传输文件格式 所以我需要将 NSTextView 的内容 文本 字体 颜色等 保存为字符串 有什么办法可以做到这一点吗 一种方法是存档
  • 应用程序仅启用纵向,但 UIImagePickerController 在 iOS6 中旋转

    请注意 下面的答案 不适用于 iOS6 所以我仍然需要答案 我的应用程序仅启用纵向模式 但是 如果我将 UIImagePickerController 作为子视图嵌入其中 并旋转设备 则顶部和底部栏将保持在同一位置 但 UIImagePic
  • iOS:应用程序在安装应用程序时不会征求用户的许可。每次都获取 kCLAuthorizationStatusNotDetermined - Objective-c 和 Swift

    我正在尝试在我的 iOS 应用程序中获取用户位置 我首先在我的项目中包含了核心定位框架 然后单击按钮 我将调用核心位置 api 如下所示 当我尝试在设备中安装它时 核心位置从不询问用户许可 当我尝试获取单击按钮时的位置时 我得到 kCLAu

随机推荐

  • 通过 jQuery 检测对特定 HTML 5 功能的支持

    我正在编写一些 HTML5 演示代码 包括类似的内容
  • python 中的 Chrome 扩展?

    我想创建一个 google chrome 扩展 具体来说 我想制作一个打包应用程序 但不是托管应用程序 我认为这将我限制在 JavaScript 和 HTML CSS 方面是否正确 我的问题是我需要做一些复杂的数学 奇异值分解 因子分析 并
  • 如何在 OMNeT++ 仿真过程中更改网络配置?

    我想修改element的一些参数 iniOMNeT 中的文件 例如模拟运行期间节点的传输速率 例如当节点收到一些控制消息时 我发现信息表明可以以某种方式循环配置 如下所示 一些变量 几个值 但是里面没有条件子句 ini文件 并且无法将来自
  • 反应本机滚动视图-scrollToEnd-在Android上

    我正在尝试调用一个将在 onFocus on 上触发的函数TextInput这将使scrollView一直向下滚动 使用scrollToEnd 所以这是我的班级组件 class MyCMP extends Component constru
  • python维护两个不同的随机实例

    我正在尝试进行一些分析 出于 原因 我希望程序中的每个对象都有自己的种子 但没有全局种子 我能完成这样的事情吗 a random seed seed1 b random seed seed1 for a in range 5 print a
  • 在 C++ 中使用 getline() 进行文件输入

    我正在尝试用 C 完成一个简单的初学者任务 我有一个包含该行的文本文件 约翰 史密斯 31 就是这样 我想使用 ifstream 变量读取此数据 但我想将名称 John Smith 读入一个字符串变量 然后将数字 31 读入一个单独的 in
  • HTML5 Canvas 改变图像颜色

    我正在使用 jquery 滑块通过着色将图像颜色从蓝色更改为红色 范围为 100 到 100 这意味着当滑块值为 0 时 图像应看起来正常 默认值 并根据滑块值从蓝色 100 到 100 变化 在我的本地 我可以将图像加载到画布中 由于某种
  • 如何在 Python 中将整个列表作为命令行参数传递?

    我试图将两个包含整数的列表作为参数传递给 python 代码 但sys argv i 获取字符串列表形式的参数 输入看起来像 python filename py 2 3 4 5 1 2 3 4 我发现了以下 hack 来转换列表 strA
  • python获取函数中参数的变量名[重复]

    这个问题在这里已经有答案了 我想做这样的事情 fib 1 foo arg print arg argName the name of the variable that was put in for arg foo fib 并得到这个返回
  • 带有 .gitignore 的白名单目录

    我想在一个 git 存储库中有两个目录 我选择的方法是在顶级目录中创建 git 存储库 然后使用 gitignore 将感兴趣的两个目录列入白名单 要求位于我尝试的 gitignore 文件的注释中 Blacklist everything
  • 如何在滚动时从 SliverAppBar 淡入/淡出小部件?

    当用户在屏幕上滚动时 我想从 SliverAppBar 中 淡入 和 淡出 小部件 这是我想做的事情的一个例子 这是我的代码 没有 褪色 https gist github com nesscx 721cd823350848e3d594ba
  • 如何获取QGraphicsItem坐标系中光标单击的位置?

    我有一个QGraphicsScene with QGraphicsItem添加到其中 假设我点击了地图图像 QGraphicsItem 其中绘制绿色圆圈 如何根据此获得点击位置QGraphicsItem并不是QGraphicsScene坐标
  • 在 ASP .NET Core Web API Controller 中注入 Serilog 的 ILogger 接口

    我能找到的有关在 ASP NET Core Web 应用程序中使用 Serilog 的所有示例都使用 MicrosoftILogger
  • 核心数据保存UIImage

    我在这个数据库中有一个核心数据 我应该保存图像 那么如何保存只需要 URL 的图像 请举例 大图像 gt 100 kb 不应保存在 CoreData 中 因为它确实会增加托管对象的内存占用 对于这些图像 我会将 CoreData 中的路径保
  • 是否可以将对象解构为现有变量?

    我正在尝试使用对象解构来提取变量 但这些变量已经存在 如下所示 const x 1 y 2 Those should be 1 and 2 const x y complexPoint const point x y 有没有办法在不重命名解
  • 使用 WhatsApp Cloud API 发送 Commerce Manager 目录产品

    成功将我的目录从商务管理器添加到 Whatsapp 管理器后 现在我想通过 WhatsApp 云 API 向用户发送该产品 我看到了与许可 API 相关的链接 但没有找到运气 https developers facebook com do
  • 通过(弹出)菜单退出应用程序时窗口泄漏

    我希望你能帮助我 我有一个漏窗只要我通过 弹出 菜单选项退出我的应用程序在工具栏中 如果我通过正常方法退出应用程序 一切都很好 有人可以帮忙吗 我似乎找不到错误 我正在尝试找到正确的解决方案 我声明了 2 个静态字符串变量 但我猜这不是问题
  • 如何在 PostgreSQL ORDER BY 子句中使用 ALIAS?

    我有以下查询 SELECT title stock one stock two AS global stock FROM product ORDER BY global stock 0 title 在 PostgreSQL 8 1 23 中
  • 根据字符串匹配过滤字符串向量

    我有以下向量 X lt c mama log papa log mimo png mentor log 如何检索另一个仅包含以 m 开头并以 log 结尾的元素的向量 您可以使用grepl用正则表达式 X grepl m log X
  • 将 AudioBufferList 转换为 CMSampleBuffer 会产生意外结果

    我正在尝试转换AudioBufferList我从音频单元得到的CMSampleBuffer我可以传递到AVAssetWriter保存麦克风中的音频 这种转换有效 因为我为执行转换而进行的调用不会失败 但记录最终会失败 并且我在日志中看到一些