Подтвердить что ты не робот

Загружать аудиоклип в реальном времени во время его записи?

Как загрузить аудиоклип в реальном времени на сервер во время его записи? В основном мое требование - загрузить аудиоклип в виде патронов/пакетов во время его записи. Я уже сделал запись с помощью 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];
}
4b9b3361

Ответ 1

Существуют различные способы решения этого вопроса, один из способов - создать собственный AudioGraph. AudioGraph может захватывать образцы с микрофона или из файла. Затем вы переходите к блоку вывода, но установите обратный вызов для получения выборочных кадров. Затем вы нажимаете на свой сетевой класс, который затем может загружать пакет за пакет.

Хорошим примером того, как записать эти захваченные пакеты на диск, является AVCaptureAudioDataOutput.

В этом примере пакеты записываются в файл ExtAudioFileWriteAsync. Вы должны заменить это своей собственной логикой для загрузки на сервер. Обратите внимание, что, хотя вы можете сделать это легко, одна проблема заключается в том, что это даст вам исходные образцы звука. Если вам нужны они как волновой файл или аналогичный, вам может потребоваться дождаться окончания записи, так как заголовок файла нуждается в информации о содержащихся в нем образцах аудио.

Ответ 2

Используемый вами код будет работать для вас, если вы хотите загрузить записанный файл после завершения записи, поскольку он даст вам окончательный записанный файл.

Если вы хотите загрузить живую аудиозапись на сервер, тогда я думаю, вам нужно пойти с комбинацией,

AudioSession для записи материала

ffmpeg для загрузки вашего живого звука на сервер.

Вы можете получить хорошую помощь для записи звука и управления аудио буферами из здесь

Для ffmpeg, я думаю, вам нужно много угадать. Будет легко отправить статический/сохраненный аудиофайл на сервер с помощью ffmpeg, но для отправки Live Audio Buffer на сервер будет сложная работа.