Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:从AVAudioRecorder获取音频_Ios_Objective C_Audio_Avfoundation_Avaudiorecorder - Fatal编程技术网

iOS:从AVAudioRecorder获取音频

iOS:从AVAudioRecorder获取音频,ios,objective-c,audio,avfoundation,avaudiorecorder,Ios,Objective C,Audio,Avfoundation,Avaudiorecorder,免责声明AVAudioRecorder新增 我在做什么我正在开发一款使用iPhone麦克风录音的应用程序。录制完声音后,我需要将声音(应该是AVAsset,对吗?)转换成NSData发送到后端 问题是什么问题是我不确定如何“获取”使用AVAudioRecorder录制的音频。AVAudioRecorder有一个名为-(void)AudioRecorderDifinishRecording:(AVAudioRecorder*)的委托方法已成功录制:(BOOL)标志。我本以为包含音频的AVAsset

免责声明AVAudioRecorder新增

我在做什么我正在开发一款使用iPhone麦克风录音的应用程序。录制完声音后,我需要将声音(应该是AVAsset,对吗?)转换成NSData发送到后端

问题是什么问题是我不确定如何“获取”使用AVAudioRecorder录制的音频。AVAudioRecorder有一个名为
-(void)AudioRecorderDifinishRecording:(AVAudioRecorder*)的委托方法已成功录制:(BOOL)标志
。我本以为包含音频的AVAsset会从这个委托方法传递过来,但事实并非如此。它给我的是
aRecorder
对象,该对象上有
.url
属性。当我从传递的
aRecorder
记录url时,它会显示出来。事实上,我可以在下面的代码中记录文件的长度:

- (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
并尝试从资产库获取文件时(与我之前的操作类似),资产不会从资产库返回(即使当我
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记录到文件中,而不是资产库中


因此,您只需从该文件中读取数据。

该文件存储在设备中的何处?通过我传递的
self.audioURL
,是否允许我从任何位置(从设备上的任何应用程序)访问实际文件?您在初始化AVAudioRecorder时决定了文件位置。是的,您可以在应用程序中访问它。我可以执行类似于
NSData*audioData=[NSData dataWithContentsOfURL:self.mediaURL]的操作吗
我要做的就是把它转换成NSData?没错!你就是这么做的。谢谢。如果我可以再问一个问题……如果我想用BytesNocopy:buffer使用方法
dataWithBytesNoCopy:buffer
,这样我最终可以“暂停”和“恢复”呢根据剩余字节数上传?该文件存储在设备中的何处?使用我传递的
self.audioURL
,是否允许我从任何位置(从设备上的任何应用程序)访问实际文件?您在初始化AVAudioRecorder时决定了文件位置。是的,您可以在应用程序中访问它。我可以执行类似于
NSData*audioData=[NSData dataWithContentsOfURL:self.mediaURL]的操作吗
我要做的就是把它转换成NSData?没错!这就是你要做的。谢谢。如果我可以再问一个问题……如果我想使用
dataWithBytesNoCopy:buffer
方法,这样我最终可以根据剩余的字节进行“暂停”和“恢复”上传呢?