在录制的音频文件的末尾添加静音
Posted
技术标签:
【中文标题】在录制的音频文件的末尾添加静音【英文标题】:Adding silence to the end of a recorded audio file 【发布时间】:2012-04-20 19:01:47 【问题描述】:目前我允许用户录制自己的声音不超过 30 秒。一旦他们完成了他们的音频录制,我就会抓住他们音频的持续时间。我运行这个快速数学 (SixtySeconds-TheirAudioDuraion) = TimeNeededToFill。基本上我需要最终得到一个精确的 1 分钟轨道。其中一部分是实际音频,其余部分是静音音频。我目前正在使用 AVAudioPlayer 来完成我所有的录音。有没有一种编程方式来实现这一点,而不是一些蛮力破解,我开始将无声音轨文件塞在一起以创建单个文件?
需要简单的光彩,我们将不胜感激。
我最好的。
【问题讨论】:
正确的方法是使用AVMutableCompositionTrack
来追加文件。请参阅下面的答案。
【参考方案1】:
这可以使用AVMutableComposionTrack insertEmptyTimerange
轻松完成。
// Create a new audio track we can append to
AVMutableComposition* composition = [AVMutableComposition composition];
AVMutableCompositionTrack* appendedAudioTrack =
[composition addMutableTrackWithMediaType:AVMediaTypeAudio
preferredTrackID:kCMPersistentTrackID_Invalid];
// Grab the audio file as an asset
AVURLAsset* originalAsset = [[AVURLAsset alloc]
initWithURL:[NSURL fileURLWithPath:originalAudioPath] options:nil];
NSError* error = nil;
// Grab the audio track and insert silence into it
// In this example, we'll insert silence at the end equal to the original length
AVAssetTrack *originalTrack = [originalAsset tracksWithMediaType:AVMediaTypeAudio];
CMTimeRange timeRange = CMTimeRangeMake(originalAsset.duration, originalAsset.duration);
[appendedAudioTrack insertEmptyTimeRange:timeRange];
if (error)
// do something
return;
// Create a new audio file using the appendedAudioTrack
AVAssetExportSession* exportSession = [AVAssetExportSession
exportSessionWithAsset:composition
presetName:AVAssetExportPresetAppleM4A];
if (!exportSession)
// do something
return;
NSString* appendedAudioPath= @""; // make sure to fill this value in
exportSession.outputURL = [NSURL fileURLWithPath:appendedAudioPath];
exportSession.outputFileType = AVFileTypeAppleM4A;
[exportSession exportAsynchronouslyWithCompletionHandler:^
// exported successfully?
switch (exportSession.status)
case AVAssetExportSessionStatusFailed:
break;
case AVAssetExportSessionStatusCompleted:
// you should now have the appended audio file
break;
case AVAssetExportSessionStatusWaiting:
break;
default:
break;
NSError* error = nil;
];
【讨论】:
文档说:“请注意,您不能将空时间范围添加到合成轨道的末尾。” .你确定这有效吗?【参考方案2】:我将有一个 60 秒的静音已经“录制”,将其附加到用户录制,然后将总长度修剪为 60 秒。
这个 SO 问题 avaudiorecorder-avaudioplayer-append-recording-to-file 在 Siddarth 的回答中引用了附加声音文件。
这个 SO question trim-audio-with-ios 包含有关修剪声音文件的信息。
【讨论】:
这是我没想到的方法……聪明!谢谢彼得! 对于所有最终查看此问答的人来说,最后一件事。我实际上已经实现了另一个解决方案,它实际上完全按照我的需要工作。彼得的答案实际上是足够的,有效的并且是一种可靠的方法。实际上,我通过播放双轨解决了我自己的问题,一个是音频,另一个是 60 秒静音的底层轨道。然后我在我的无声音轨上调用“audioDidFinishPlaying”来完成我剩下的工作。希望这对任何读者都有帮助!以上是关于在录制的音频文件的末尾添加静音的主要内容,如果未能解决你的问题,请参考以下文章