2015-05-05 115 views
13

如何将音频片段实时上传到服务器而录制?基本上我的要求是上传一个音频剪辑作为卡盘/数据包,而其录音。 我已经使用IQAudioRecorderController https://github.com/hackiftekhar/IQAudioRecorderController做了录音部分。它会记录音频并保存到TemporaryDirectory。在录音时实时上传音频剪辑?

我想知道如何在不保存音频剪辑的情况下实时上传。

这是记录部分

//Unique recording URL 


NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString]; 
_recordingFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.m4a",fileName]]; 


// Initiate and prepare the recorder 

_audioRecorder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:_recordingFilePath] settings:recordSetting error:nil]; 
_audioRecorder.delegate = self; 
_audioRecorder.meteringEnabled = YES; 


// Recording start 
- (void)recordingButtonAction:(UIBarButtonItem *)item 
{ 
if (_isRecording == NO) 
    { 
    _isRecording = YES; 

    //UI Update 
    { 
     [self showNavigationButton:NO]; 
     _recordButton.tintColor = _recordingTintColor; 
     _playButton.enabled = NO; 
     _trashButton.enabled = NO; 
    } 

    /* 
    Create the recorder 
    */ 
    if ([[NSFileManager defaultManager] fileExistsAtPath:_recordingFilePath]) 
    { 
     [[NSFileManager defaultManager] removeItemAtPath:_recordingFilePath error:nil]; 
    } 

    _oldSessionCategory = [[AVAudioSession sharedInstance] category]; 
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil]; 
    [_audioRecorder prepareToRecord]; 
    [_audioRecorder record]; 
} 
else 
{ 
    _isRecording = NO; 

    //UI Update 
    { 
     [self showNavigationButton:YES]; 
     _recordButton.tintColor = _normalTintColor; 
     _playButton.enabled = YES; 
     _trashButton.enabled = YES; 
    } 

    [_audioRecorder stop]; 
    [[AVAudioSession sharedInstance] setCategory:_oldSessionCategory error:nil]; 
} 
} 

// Recording done 

-(void)doneAction:(UIBarButtonItem*)item 
{ 
    if ([self.delegate respondsToSelector:@selector(audioRecorderController:didFinishWithAudioAtPath:)]) 
    { 
     IQAudioRecorderController *controller = (IQAudioRecorderController*)[self navigationController]; 
     [self.delegate audioRecorderController:controller didFinishWithAudioAtPath:_recordingFilePath]; 
    } 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

回答

1

有解决这个的各种方式,一种方式是创建自己的AudioGraph。 AudioGraph可以从麦克风或文件中获取样本。然后继续输出单位,但安装回调以获取采样的帧。然后你将这些数据推送到你的网络类,然后可以逐个数据包地上传数据包

一个很好的例子,说明如何将这些捕获的数据包写入磁盘是AVCaptureAudioDataOutput

在这个例子中,数据包被写入起诉ExtAudioFileWriteAsync。您必须将其替换为您自己的上传到服务器的逻辑。请注意,尽管您可以轻松地做到这一点,但一个问题是,这会为您提供原始音频样本。如果您需要将它们作为波形文件或类似文件,则可能需要等待直到录制完成,因为文件的标题需要关于包含的音频样本的信息。

-1

如果您想在录制完成后上传录制文件,您正在使用的代码将适用于您,因为它会为您提供最终录制的文件。

如果您想上传现场录音到那么我认为你必须去与组合的服务器,

AudioSession记录的东西

ffmpeg上传直播音频服务器。

你可以录制音频和here

管理音频缓冲区进行的ffmpeg我认为你有李尔有很多很好的帮助。使用ffmpeg将静态/保存的音频文件发送到服务器将很容易,但将现场音频缓冲区发送到服务器将是一件棘手的工作。

+0

您不需要'ffmpeg'来上传音频,而且您可能会将App中内置的应用程序放在App Store上发生许可问题。 – damian

+0

ffmpeg可能还有其他选项,但是如果您关心授权,那么将应用程序提交给App Store是没有问题的,因为我成功地向App Store提交了一个包含ffmpeg实现的应用程序,但是您必须提及您正在使用它您的应用程序的信用目的。 – Yuvrajsinh

+0

ffmpeg获得LGPL许可。 LGPL的条款与App Store不兼容。基本上,你违反了ffmpeg许可条款。 https://trac.ffmpeg.org/ticket/1229 – damian