2016-09-21 4 views
1

Я использую https://github.com/tumtumtum/StreamingKitiOS StreamingKit как записывать/сохранять аудио?

для передачи текущего URL. работает отлично. Я хочу добавить запись/сохранение аудио функции в свое приложение. Кто-нибудь знает, может ли эта библиотека это сделать? Если нет, есть ли альтернативы? Учтите, что мне нужно записать LIVE потоковое аудио, а не локальный файл/статический URL.

страница показывает, что вы можете перехватить данные ИКМ непосредственно перед его сыграна:

[audioPlayer appendFrameFilterWithName:@"MyCustomFilter" block:^(UInt32 channelsPerFrame, UInt32 bytesPerFrame, UInt32 frameCount, void* frames) 
{ 
    ... 
}]; 

Однако, я не знаю, как преобразовать это в реальной записи/MP3-файл или даже перехватывать фактические данные из этого ?

ответ

1

Вы можете сделать что-то подобное, хотя StreamingKit кажется немного скрытным в отношении формата образцов, которые он вам дает. Какова частота дискретизации? Поплавки или ints? Полагаю, вы можете догадаться из размера выборки. Этот пример предполагает 16 бит int.

NSURL *dstUrl = [[NSURL fileURLWithPath:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] ] URLByAppendingPathComponent:@"output.m4a"]; 

NSLog(@"write to %@", dstUrl); 

__block AVAudioFile *audioFile = nil; 

[audioPlayer appendFrameFilterWithName:@"MyCustomFilter" block:^(UInt32 channelsPerFrame, UInt32 bytesPerFrame, UInt32 frameCount, void* frames) 
{ 
    NSError *error; 

    // what's the sample rate? StreamingKit doesn't seem to tell us 
    double sampleRate = 44100; 

    if (!audioFile) { 
     NSDictionary *settings = 
     @{ 
      AVFormatIDKey : @(kAudioFormatMPEG4AAC), 
      AVSampleRateKey : @(sampleRate), 
      AVNumberOfChannelsKey : @(channelsPerFrame), 
      }; 

     // need commonFormat? 
     audioFile = [[AVAudioFile alloc] initForWriting:dstUrl settings:settings commonFormat:AVAudioPCMFormatInt16 interleaved:YES error:&error]; 
     if (!audioFile) { 
      // error 
     } 
    } 

    AVAudioFormat *format = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatInt16 sampleRate:sampleRate channels:channelsPerFrame interleaved:YES]; 
    AVAudioPCMBuffer *buffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:format frameCapacity:frameCount]; 

    buffer.frameLength = frameCount; 
    memmove(buffer.int16ChannelData[0], frames, frameCount*bytesPerFrame); 

    if (![audioFile writeFromBuffer:buffer error:&error]) { 
     NSLog(@"write error: %@", error); 
    } 
}]; 

[self.audioPlayer performSelector:@selector(removeFrameFilterWithName:) withObject:@"MyCustomFilter" afterDelay:10]; 
+0

спасибо, попробуй это утром и сообщите об этом! Посмотрев исходный код streamingkit, я вижу два места, где может быть определена частота выборки: '.mSampleRate = 44100.00,' в 'initialize' и' Float64 graphSampleRate = 44100.0; 'в' createMixerUnit' –

+0

Пожалуйста, дайте мне знать, как это сделано –

+0

ps Я не думаю, что iOS предоставляет mp3-кодер. Вам лучше сохранить mp3-пакеты напрямую, если StreamingKit позволяет вам. –

Смежные вопросы