iOS: 从 AVAudioRecorder 获取音频
iOS: Get Audio from AVAudioRecorder
免责声明 AVAudioRecorder 的新手
我在做什么 我正在开发一个使用 iPhone 麦克风录制声音的应用程序。录完声音后,我需要把声音(应该是AVAsset吧?)转换成NSData发送到后台。
有什么问题问题是我不确定如何"get"应该使用AVAudioRecorder 录制的音频。 AVAudioRecorder 有一个名为 - (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag
的委托方法。我本来期望包含音频的实际 AVAsset 从该委托方法传递,但事实并非如此。它给我的是 aRecorder
对象,上面有 .url
属性。当我从传递的 aRecorder
中 NSLog url 时,它会显示出来。事实上,我可以在下面的代码中 NSLog 文件的长度:
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag
{
DLog (@"audioRecorderDidFinishRecording:successfully: %@",aRecorder);
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:aRecorder.url options:nil];
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
NSLog(@"asset length = %f", audioDurationSeconds); //Logs 7.051 seconds, so I know it's "there".
self.audioURL = aRecorder.url;
}
问题 当我将 self.audioURL
传递给下一个 viewController 的 self.mediaURL
并尝试从 AssetLibrary 中获取文件时(类似地与我之前的做法一样),资产不会从 AssetLibrary 返回(即使当我 po self.mediaURL
它确实记录了正确的 url:
if (self.mediaURL) {
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
[assetLibrary assetForURL:self.mediaURL resultBlock:^(ALAsset *asset) {
if (asset) {
// This block does NOT get called...
ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc((long)rep.size);
NSUInteger buffered =[rep getBytes:buffer fromOffset:0.0 length:(long)rep.size error:nil];
NSMutableData *body = [[NSMutableData alloc] init];
body = [NSMutableData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
[dataToSendToServer setObject:body forKey:@"audioData"];
}
} failureBlock:^(NSError *error) {
NSLog(@"FAILED TO ACCESS AUDIO FROM URL: %@!", self.mediaURL);
}];
}
else {
NSLog(@"NO AUDIO DATA!");
}
}
因为我是 AVAudioRecorder 的新手,也许我只是没有正确设计这个流程。谁能帮我获取实际的音频数据。
谢谢!
AVAudioRecorder 录制到一个文件,而不是资源库。
因此您可以简单地从该文件中读取数据。
免责声明 AVAudioRecorder 的新手
我在做什么 我正在开发一个使用 iPhone 麦克风录制声音的应用程序。录完声音后,我需要把声音(应该是AVAsset吧?)转换成NSData发送到后台。
有什么问题问题是我不确定如何"get"应该使用AVAudioRecorder 录制的音频。 AVAudioRecorder 有一个名为 - (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag
的委托方法。我本来期望包含音频的实际 AVAsset 从该委托方法传递,但事实并非如此。它给我的是 aRecorder
对象,上面有 .url
属性。当我从传递的 aRecorder
中 NSLog url 时,它会显示出来。事实上,我可以在下面的代码中 NSLog 文件的长度:
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *) aRecorder successfully:(BOOL)flag
{
DLog (@"audioRecorderDidFinishRecording:successfully: %@",aRecorder);
AVURLAsset* audioAsset = [AVURLAsset URLAssetWithURL:aRecorder.url options:nil];
CMTime audioDuration = audioAsset.duration;
float audioDurationSeconds = CMTimeGetSeconds(audioDuration);
NSLog(@"asset length = %f", audioDurationSeconds); //Logs 7.051 seconds, so I know it's "there".
self.audioURL = aRecorder.url;
}
问题 当我将 self.audioURL
传递给下一个 viewController 的 self.mediaURL
并尝试从 AssetLibrary 中获取文件时(类似地与我之前的做法一样),资产不会从 AssetLibrary 返回(即使当我 po self.mediaURL
它确实记录了正确的 url:
if (self.mediaURL) {
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
[assetLibrary assetForURL:self.mediaURL resultBlock:^(ALAsset *asset) {
if (asset) {
// This block does NOT get called...
ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc((long)rep.size);
NSUInteger buffered =[rep getBytes:buffer fromOffset:0.0 length:(long)rep.size error:nil];
NSMutableData *body = [[NSMutableData alloc] init];
body = [NSMutableData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
[dataToSendToServer setObject:body forKey:@"audioData"];
}
} failureBlock:^(NSError *error) {
NSLog(@"FAILED TO ACCESS AUDIO FROM URL: %@!", self.mediaURL);
}];
}
else {
NSLog(@"NO AUDIO DATA!");
}
}
因为我是 AVAudioRecorder 的新手,也许我只是没有正确设计这个流程。谁能帮我获取实际的音频数据。
谢谢!
AVAudioRecorder 录制到一个文件,而不是资源库。
因此您可以简单地从该文件中读取数据。