实时上传音频片段,同时进行录制?

14
如何在录制时实时上传音频剪辑到服务器?基本上,我的要求是在录制时将音频剪辑作为块/数据包上传。我已经使用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];
}
2个回答

1

有多种方法可以解决此问题,其中一种方法是创建自己的AudioGraph。 AudioGraph可以从麦克风或文件中获取样本。然后,您继续进入输出单元,但安装回调以获取采样帧。这些样本帧然后被推送到您的网络类中,然后可以逐个上传数据包。

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

在该示例中,数据包使用ExtAudioFileWriteAsync进行写入。您需要用自己的逻辑替换它以上传到服务器。请注意,虽然您可以轻松完成这项任务,但一个问题是这将为您提供原始音频样本。如果您需要它们作为波形文件或类似文件,则可能需要等待录制结束,因为文件头需要包含有关所包含音频样本的信息。


-1

如果您想在录音完成后上传录制文件,那么您目前正在使用的代码应该可以为您提供最终录制文件。

如果您想上传实时音频录制到服务器,则需要结合以下内容:

使用AudioSession进行录制

使用ffmpeg将您的实时音频上传到服务器。

您可以在这里获取有关录制音频和管理音频缓冲区的良好帮助。

对于ffmpeg,我认为您需要学习很多。使用ffmpeg将静态/保存的音频文件发送到服务器很容易,但是将实时音频缓冲区发送到服务器将是棘手的工作。


你不需要使用 ffmpeg 来上传音频,而且如果在 App Store 上发布使用它构建的应用程序,可能会遇到许可问题。 - damian
可能有其他的 ffmpeg 选项,但如果你关心许可问题,在将构建提交到应用商店方面是没有问题的,因为我成功地提交了一个包含 ffmpeg 实现的应用程序到应用商店,但你必须在你的应用程序中提及你正在使用它以获得信用。 - Yuvrajsinh
1
ffmpeg的许可证是LGPL。LGPL的条款与App Store不兼容。基本上,您正在违反ffmpeg的许可条款。https://trac.ffmpeg.org/ticket/1229 - damian
1
无论如何,您不需要使用ffmpeg来流式传输音频,苹果已经内置了可以很好地完成此任务的库。 - damian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接