我正在寻找一种好的音频格式来在本地保存录音并通过网络传输。要求是:
- 质量不错。这些剪辑,收到后将被多次收听
- 工作流程应支持传输前的修剪和淡入淡出
- 不错的文件大小
这是我目前的录制方法:
// SEE IMA4 vs M4A http://stackoverflow.com/questions/3509921/recorder-works-on-iphone-3gs-but-not-on-iphone-3g
NSDictionary *recordSettings =
[[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithFloat: 11025], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatLinearPCM], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithBool:NO], AVLinearPCMIsFloatKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
NSError *error = nil;
self.audioRecorder = [[ AVAudioRecorder alloc] initWithURL:self.recordingFile settings:recordSettings error:&error];
和编码方法:
NSString *file = [NSString stringWithFormat:@"recordingConverted%x.caf", arc4random()];
self.filePath = [NSTemporaryDirectory() stringByAppendingPathComponent: file];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:self.filePath]) {
NSError *error;
if ([fileManager removeItemAtPath:self.filePath error:&error] == NO) {
NSLog(@"removeItemAtPath %@ error:%@", self.filePath, error);
}
}
NSLog(@"IN: %@", self.recordingFile);
NSLog(@"OUT: %@", self.filePath);
AVAsset *avAsset = [AVAsset assetWithURL:self.recordingFile];
// get the first audio track
NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeAudio];
if ([tracks count] == 0) return nil;
AVAssetTrack *track = [tracks objectAtIndex:0];
// create the export session
// no need for a retain here, the session will be retained by the
// completion handler since it is referenced there
AVAssetExportSession *exportSession = [AVAssetExportSession
exportSessionWithAsset:avAsset
presetName:AVAssetExportPresetAppleM4A];
if (nil == exportSession) return nil;
// create trim time range
CMTime startTime = CMTimeMake(self.speakingBeginTime*44100, 44100);
CMTime stopTime = CMTimeMake((self.speakingBeginTime+[self.duration doubleValue])*44100, 44100);
CMTimeRange exportTimeRange = CMTimeRangeFromTimeToTime(startTime, stopTime);
// create fade in time range
CMTime startFadeInTime = startTime;
CMTime endFadeInTime = CMTimeMake((self.speakingBeginTime+RECORDING_INTERVAL)*1.5*44100, 44100);
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:self.filePath]; // output path
exportSession.outputFileType = AVFileTypeAppleM4A; // output file type
exportSession.timeRange = exportTimeRange; // trim time range
exportSession.audioMix = exportAudioMix; // fade in audio mix
// 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);
dispatch_release(semaphore);
if (AVAssetExportSessionStatusCompleted == exportSession.status) {
return self.filePath;
//NSLog(@"AVAssetExportSessionStatusCompleted");
} 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);
}
目前,3 秒音频剪辑的性能为:PCM 为 62,228 字节,编码为 36,654 字节。看来我可以做得更好。
我在这里找到了指南:
http://gamua.com/blog/2010/06/sound-on-ios-best-practices/
有助于选择声音格式(尤其是评论)
这里也有一些很好的例子:
如何使用 AVAudioRecorder 在 iPhone 上录制音频?
尤其是具有各种导出格式的示例,以及以下答案:
https://stackoverflow.com/a/3870385/2214106
这显着减小了文件大小。