iOS:如何修剪 .aif 音频录制开始和结束时的静音?

2023-12-20

我的应用程序包括用户录制简短消息的功能;我想从录音的开头和结尾删除任何静音(或者更准确地说,任何音量低于给定阈值的音频)。

我正在使用 AVAudioRecorder 录制音频,并将其保存到 .aif 文件中。我在其他地方看到过一些提到的方法,通过这些方法我可以让它等待音频电平达到阈值才开始录音;这会让我成功一半,但无助于消除最后的沉默。

如果有一个简单的方法可以做到这一点,我将永远感激不已!

Thanks.


该项目从麦克风获取音频,在大声噪音时触发,在安静时取消触发。它还会在末端周围进行修剪和淡入/淡出。

https://github.com/fulldecent/FDSoundActivatedRecorder https://github.com/fulldecent/FDSoundActivatedRecorder

您正在寻找的相关代码:

- (NSString *)recordedFilePath
{
    // Prepare output
    NSString *trimmedAudioFileBaseName = [NSString stringWithFormat:@"recordingConverted%x.caf", arc4random()];
    NSString *trimmedAudioFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:trimmedAudioFileBaseName];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:trimmedAudioFilePath]) {
        NSError *error;
        if ([fileManager removeItemAtPath:trimmedAudioFilePath error:&error] == NO) {
            NSLog(@"removeItemAtPath %@ error:%@", trimmedAudioFilePath, error);
        }
    }
    NSLog(@"Saving to %@", trimmedAudioFilePath);

    AVAsset *avAsset = [AVAsset assetWithURL:self.audioRecorder.url];
    NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeAudio];
    AVAssetTrack *track = [tracks objectAtIndex:0];

    AVAssetExportSession *exportSession = [AVAssetExportSession
                                           exportSessionWithAsset:avAsset
                                           presetName:AVAssetExportPresetAppleM4A];

    // create trim time range
    CMTime startTime = CMTimeMake(self.recordingBeginTime*SAVING_SAMPLES_PER_SECOND, SAVING_SAMPLES_PER_SECOND);
    CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, kCMTimePositiveInfinity);

    // create fade in time range
    CMTime startFadeInTime = startTime;
    CMTime endFadeInTime = CMTimeMake(self.recordingBeginTime*SAVING_SAMPLES_PER_SECOND + RISE_TRIGGER_INTERVALS*INTERVAL_SECONDS*SAVING_SAMPLES_PER_SECOND, SAVING_SAMPLES_PER_SECOND);
    CMTimeRange fadeInTimeRange = CMTimeRangeFromTimeToTime(startFadeInTime, endFadeInTime);

    // setup audio mix
    AVMutableAudioMix *exportAudioMix = [AVMutableAudioMix audioMix];
    AVMutableAudioMixInputParameters *exportAudioMixInputParameters =
    [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];

    [exportAudioMixInputParameters setVolumeRampFromStartVolume:0.0 toEndVolume:1.0
                                                      timeRange:fadeInTimeRange];
    exportAudioMix.inputParameters = [NSArray
                                      arrayWithObject:exportAudioMixInputParameters];

    // configure export session  output with all our parameters
    exportSession.outputURL = [NSURL fileURLWithPath:trimmedAudioFilePath];
    exportSession.outputFileType = AVFileTypeAppleM4A;
    exportSession.timeRange = exportTimeRange;
    exportSession.audioMix = exportAudioMix;

    // MAKE THE EXPORT SYNCHRONOUS
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
        dispatch_semaphore_signal(semaphore);
    }];
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    if (AVAssetExportSessionStatusCompleted == exportSession.status) {
        NSLog(@"AVAssetExportSessionStatusCompleted");
        return trimmedAudioFilePath;
    } else if (AVAssetExportSessionStatusFailed == exportSession.status) {
        // a failure may happen because of an event out of your control
        // for example, an interruption like a phone call comming in
        // make sure and handle this case appropriately
        NSLog(@"AVAssetExportSessionStatusFailed %@", exportSession.error.localizedDescription);
    } else {
        NSLog(@"Export Session Status: %d", exportSession.status);
    }
    return nil;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS:如何修剪 .aif 音频录制开始和结束时的静音? 的相关文章

随机推荐

  • 如何在 sed 的命令中使用变量?

    I have abc sh exec ROOT Subsystem xyz sh 在 Unix 机器上 如果我打印echo HOME然后我得到 HOME COM FILE 我想更换 ROOT with HOME使用 sed 预期输出 exe
  • iPhone:禁用“双击空格键。”捷径?

    默认情况下 如果您在 iPhone 或 iPad 上点击空格键两次 则不会得到 两个空格 而是得到 句点后跟一个空格 有什么方法可以在代码中禁用此快捷方式吗 更新 通过 UITextInputTraits 禁用自动更正不起作用 更新2 明白
  • Scala中涉及抽象类型时没有动态绑定?

    当我在 Martin Odersky 的抽象类型中尝试动物 食品示例时Scala 编程 class Food abstract class Animal type SuitableFood lt Food def eat food Suit
  • 将 vue-router 组件解释为一个函数

    我在几个不同的地方看到了以下类型的路由定义 path dashboard component render c return c router view children path component Dashboard 我试图理解这有什么
  • Linux 中的 SDL 桌面分辨率检测[重复]

    这个问题在这里已经有答案了 我收到一些报告称 对于某些 Linux 用户 尤其是使用 SteamOS 的用户 我的游戏以错误的分辨率打开 游戏尝试检测当前桌面分辨率并使用该分辨率创建无边框全屏窗口 例如 SteamOS 的分辨率通常为 19
  • java.lang.StackOverflowError:在 ListView 适配器中启用/禁用 TextView#setTextIsSelectable 时堆栈大小为 8MB

    我有一个活动ListView 显示TextView在每个列表项中 使用这些方法切换选定位置的属性EditText setTextIsSelectable EditText setEllipsize EditText setSingleLin
  • XCTest相对于SenTestingKit有哪些优势?

    我想在 iOS 中进行单元测试 默认情况下 测试类是使用 Xcode 5 中的 XCTest 框架类创建的 我在早期版本的 iOS 中使用了 SenTestingKit 这两个框架有什么区别 XCTest框架有哪些优势 我用谷歌搜索了相关文
  • 材料表使行在单击时可编辑

    使用材料表 https material table com 库中 我试图使表行可以通过双击进行编辑 单击该行应该与单击操作列最左侧的编辑按钮具有相同的效果 我已成功链接到正确的事件处理程序 现在双击一行时由警报框表示 https code
  • kohana3.0如何彻底删除镜像文件?

    我有一个 kohana3 0 内容和文件管理系统 当用户删除图像时 我希望能够从数据库以及我上传图像的文件夹中完全删除图像 现在我用于图像删除 public function delete id NULL parent delete id
  • gdb - 执行命令n次

    我正在使用 gdb 调试器来运行一个包含循环的程序 让我们坐在 10 中 当我进入循环时 我不想进入它 我知道我可以在循环之后设置第二个断点 而不是 c 继续 但我也记得有可能做类似 n 10 接下来的 10 次 的事情 n 10 不起作用
  • 如何使用 Ansible 创建新分区

    当我在命令行上运行它时 它工作正常 echo e n np n1 n n nw sudo fdisk dev sdb 但在 Ansible 中它不想在 shell 中运行 name partition new disk shell echo
  • 如何在运行时填充 boost::fusion::vector ?

    首先 为与我之前的问题相似而道歉here https stackoverflow com questions 13094535 iterating over boost fusionvector 但我认为我问得不对 我有一个方法 templ
  • 在 .net 2.0 应用程序中加载 .net 3.5 wpf-forms

    我正在尝试在 net 2 0 Windows 窗体应用程序中加载和托管 WPF 控件 仅当安装了 net 3 5 时才应加载 WPF 控件 我找到了一个链接在 MFC 应用程序中托管 WPF 内容 http www codeguru com
  • npm 认为 Node 已经过时了,但事实并非如此

    我正在尝试安装node gyp 我跑 sudo npm install g node gyp 我收到一条错误 提示它需要节点 0 8 0 并提示我正在运行 0 6 12 问题是 我不是 我正在使用 NVM 目前正在运行 0 11 somet
  • 如何将 numpy 数组列表转换为单个 numpy 数组?

    假设我有 LIST array 1 2 3 4 5 array 1 2 3 4 5 1 2 3 4 5 inner lists are numpy arrays 我尝试转变 array 1 2 3 4 5 1 2 3 4 5 1 2 3 4
  • 无法在 Google App Engine 上运行 Flask 调试模式

    我正在使用 Python 2 7 在 Google App Engine 上运行 Flask 0 9 Werkzeug 0 8 3 并且我非常希望运行 Werkzeug 调试器 尝试使用后werkzeug appengine debugge
  • 未知管理员:ComponentInfo - 尝试为生产 Android 设备启用 kiosk 模式?

    我正在尝试为我的设备启用信息亭模式 但收到未知的管理错误 我很确定我成功地将我的应用程序设置为设备所有者 并且我认为这是最后一步 但这个错误给我带来了很多麻烦 清单 我这里有一个接收器 应该将我的应用程序绑定为设备管理员 它还引用了 dev
  • 在javascript中使用window.open()有什么限制吗

    使用有限制吗window open URL 在 JavaScript 中 当我尝试使用打开三个窗口时window open URL 打开第二个窗口后 第三个窗口没有单独打开 但它只是刷新第一个窗口的内容并在其中显示第三个窗口的内容 使用 b
  • Java中showMessageDialog中的frame和null有什么区别?

    假设我有一个 JFrame 类的对象作为框架 我想知道有什么区别 JOptionPane showMessageDialog null message and JOptionPane showMessageDialog frame mess
  • iOS:如何修剪 .aif 音频录制开始和结束时的静音?

    我的应用程序包括用户录制简短消息的功能 我想从录音的开头和结尾删除任何静音 或者更准确地说 任何音量低于给定阈值的音频 我正在使用 AVAudioRecorder 录制音频 并将其保存到 aif 文件中 我在其他地方看到过一些提到的方法 通