- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用具有以下设置的 AVAudioRecorder
在 iPhone 上录制音频:
NSMutableDictionary *recordSettings = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithInt: kAudioFormatMPEG4AAC], AVFormatIDKey,
[NSNumber numberWithFloat:44100.0], AVSampleRateKey,
[NSNumber numberWithInt:1], AVNumberOfChannelsKey,
[NSNumber numberWithInt:12800], AVEncoderBitRateKey,
[NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,
[NSNumber numberWithInt: AVAudioQualityHigh], AVEncoderAudioQualityKey,
nil];
(我可以灵活地处理这些设置中的大部分,但我必须使用 MPEG4 AAC。)
我将音频保存到文件中。
用户需要能够在以后返回并继续录制到同一个文件。似乎没有直接使用 AVAudioRecorder
执行此操作的选项,因此我正在录制到一个新文件并将它们连接起来。
目前我使用 AVMutableComposition
和 AVMutableCompositionTrack
作为 here 附加文件, 但对于较长的录音来说它真的很慢所以这真的不可行。
我认为,如果我可以从第二个文件中去除 header ,将音频数据附加到第一个文件,然后更改组合文件的 header 以反射(reflect)新的持续时间,会快得多。据我所知,这两个文件是使用完全相同的设置创建的,我认为 header 中的其他详细信息应该是相同的。
不幸的是,我找不到任何关于标题格式的信息,或者是否可以用这种方式组合文件。
所以我的问题是:
最佳答案
虽然我们要求 AVAudioRecorder
以 MPEG4-AAC 格式录制,但它总是生成 .caf(核心音频格式)文件。然而,这只是一种包装格式,它包含的实际音频数据是 AAC 格式。
最后,附加文件归结为逐字节操作 .caf 文件。核心音频格式文件的规范是 here .消化这份文件并相应地处理文件一开始有点令人不快,但事实证明规范非常清晰和完整,所以并不太繁琐。
正如规范所解释的那样,.caf 文件由以四字节名称开头的 block 组成。对于 AAC 文件,总是有一个 desc
block 和一个 kuki
block 。我们知道我们的两个原始文件格式相同,我们可以将这些 block 原封不动地复制到输出文件中。
还有一个pakt
block 和一个data
block 。我们不能保证这些在输入文件中的顺序。可能有也可能没有 free
block - 但它只包含填充 0x00,所以我们不需要将它复制到输出文件。
要组合 pakt
block ,我们需要检查 block 头并生成一个新的 pakt
block ,其 mNumberPackets
和 mNumberValidFrames
字段是输入文件中那些字段的总和。 mPrimingFrames
和 mRemainderFrames
始终为零 - 这些仅与流媒体相关。大部分 pakt
block (即实际的数据包表数据)可以直接连接起来。
与data
block 类似:mChunkSize
字段需要求和,然后可以连接大部分数据。
从这些文件中的所有二进制数字字段读取数据时要小心:文件是大端,但 iPhone 是小端。
为了加分,您可能还想考虑从文件中删除音频片段,或将一个音频文件插入另一个音频文件的中间。这有点棘手,因为您必须解析 pakt
block 的内容。同样是遵循规范的情况:有一个很好的描述如何将数据包大小存储在可变长度整数中,因此您必须解析这些以找出每个数据包在 data< 中占用了多少字节
block ,并相应地计算它们的位置。
总而言之,这比我希望的要麻烦得多。也许有一个开源库可以为您完成所有这些工作,但我找不到。
但是,与在原始问题中使用 AVMutableComposition
和 AVMutableCompositionTrack
相比,像这样处理原始文件快得让人眼花缭乱——将一个小时的录音插入另一个相同的文件中长度大约需要两秒钟。
祝你好运!
关于iphone - 如何附加到录制的 MPEG4 AAC 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5154125/
我正在尝试解决 A/V 同步问题。视频将比音频延迟 1 秒。 (请看我下面的注释) 来自 Android 媒体框架部分, 我可以延迟音频时间戳让它与视频同步,我应该从哪里开始?是音频源吗? MPEG4
我正在使用带有 SignalR 的 MassTransit 请求和响应。该网站向创建文件的 Windows 服务发出请求。创建文件后,Windows 服务会将响应消息发送回网站。该网站将打开该文件并使
我正在尝试创建一个允许用户发出一些声音的应用程序,然后以回放方式使用它。 我想让我的应用程序播放用户将记录的.wav文件。 由于不断出现错误,我在弄清楚如何编写此代码时遇到了麻烦。 ====
有没有办法禁止网页上视频的屏幕共享? 例如,当您尝试录制或屏幕共享(例如通过 Skype)Netflix 视频时,它仅显示黑屏并且没有音频。 我的问题是,他们是如何实现的?我只能想到JavaScrip
我正在尝试使用 html5 .getUserMedia 录制视频,然后在不上传到服务器的情况下再次播放。我尝试了很多教程,我通过使用 canvas 绘制 webp 图像然后使用 Whammy.js 转
我想为我的网站的用户实现屏幕录制功能。这将适用于便士拍卖风格的网站,以便用户可以记录他们的出价,并在拍卖出现问题时提供证据。 这是在线录音机的演示。 http://www.screentoaster.
所以在我的应用程序中,我尝试使用屏幕截图“记录”屏幕。我必须将这些单独的帧作为图像,因为它们稍后会在服务器上进行修改和组合。增加这种复杂性的是,它是在使用 Cocos2D 的慢节奏游戏中。我目前截屏的
是否可以使用单个 ffmpeg 命令同时捕获(记录)RTSP 流和捕获场景变化事件?我几乎可以做我想做的事: ffmpeg -i 'rtsp://mystream' \ -map 0:v -map 0
我是 Objective-c 和 iPhone 编程新手,但我正在开发一个自学应用程序。我一直在尝试弄清楚如何在 iPhone 上录制声音。 Apple 提供了使用 AVAudioRecorder 从
我无法写任何东西来允许这样做,但我希望有人能指出我找到可以做到这一点的代码的正确方向。我擅长 HTML 和 CSS,对 JS 非常陌生。 我需要的是能够使用我的麦克风在单页网站上讲话,并将其流回。这样
想象一下您在浏览器中观看体育赛事直播。这意味着您收到了视频流,对吗?我需要记录这个流并保存到磁盘。问题是我不知道从哪里开始。我对编程并不陌生,但在视频直播方面有一些经验。我看到这个问题分为以下几个部分
我在开始录制时遇到文件未找到异常。此外,我无法在 JMeter 可安装文件夹中找到 RootCA 证书。 最佳答案 根据 TestRecording210 JMeter Wiki 页面当用户(您在其下
我有这个源代码可以在浏览器中录制音频。 Record.js 调用另一个脚本提供录音并将其保存到服务器。 index.html record.js //starts by click on butt
我允许用户按下按钮以通过 SoundPool 播放声音。是否可以录制 SoundPool 正在播放的任何内容,以便用户可以录制一系列声音? 最佳答案 实际上不可能捕捉到播放的声音。我也有同样的愿望,但
我正在尝试使用 xcrun simctl io booted recordVideo recording.mov 录制我的 iOS 11.4 模拟器的屏幕。这将创建一个具有该名称的文件,但不幸的是该文
好的,我将尝试尽可能清楚地说明我的问题,但我很困惑,所以如果我没有传达信息,请告诉我。 我正在尝试使用 getUserMedia 来使用网络摄像头,然后使用这个 http://www.w3.org/T
是否可以使用 html5 录制声音?我已经下载了最新的 canary 版本的 chrome 并使用以下代码: navigator.getUserMedia = navigator.webkitGetU
很多人都在问这个,似乎没有人有答案,所以我也没有。 某些应用程序如何提供记录android系统音频输出的功能?我发现的所有内容都是在 1432 个不同站点上的相同教程,您可以在其中记录 MIC 输入。
不小心撞到了qq而不是 @q ,我的 vim 现在正在记录到寄存器 q . 如果我输入 q再次,它将覆盖以前录制的宏。 有没有办法 取消录制以免覆盖之前的宏或 恢复之前的宏而不从头开始重新录制? 最佳
当我们接到电话时,我们会向来电者播放提示,内容类似于“我们可能会出于质量和培训目的记录通话”。 我们为响应来电而发送的 TWiML 如下所示。 http://domain.tld/may_r
我是一名优秀的程序员,十分优秀!