Запись буферов потоковых mp3-пакетов в файл wav с использованием ExtAudioFileWrite ios

Я работаю над приложением онлайн-радио. Мне удалось воспроизвести потоковые mp3-пакеты с сервера Icecast с помощью AudioQueueServices, с чем я борюсь за реализацию функции записи.

Поскольку потоковая передача осуществляется в формате mp3, я не могу записывать аудиопакеты напрямую в файл с помощью AudioFileWritePackets.

Чтобы использовать автоматическое преобразование расширенного звука, я использую ExtAudioWriteFile для записи в файл WAV. Я настроил AudioStreamBasicDescription для входящих пакетов с помощью функции обратного вызова FileStreamOpen AudioFileStream_PropertyListenerProc и формата назначения, который я заполнил вручную. Код успешно создает файл и записывает в него пакет, но при воспроизведении слышит белый шум; Вот мой код

// when the recording button is pressed this function creates the file and setup the asbd
    -(void)startRecording{
        recording = true;
        OSStatus status;
        NSURL *baseUrl=[self applicationDocumentsDirectory];//returns the document direcotry of the app
        NSURL *audioUrl = [NSURL URLWithString:@"Recorded.wav" relativeToURL:baseUrl];
       //asbd setup for the destination file/wav file
        AudioStreamBasicDescription dstFormat;
        dstFormat.mSampleRate=44100.0;
        dstFormat.mFormatID=kAudioFormatLinearPCM;   dstFormat.mFormatFlags=kAudioFormatFlagsNativeEndian|kAudioFormatFlagIsSignedInteger|kAudioFormatFlagIsPacked;
        dstFormat.mBytesPerPacket=4;
        dstFormat.mBytesPerFrame=4;
        dstFormat.mFramesPerPacket=1;
        dstFormat.mChannelsPerFrame=2;
        dstFormat.mBitsPerChannel=16;
        dstFormat.mReserved=0;
        //creating the file    
        status = ExtAudioFileCreateWithURL(CFBridgingRetain(audioUrl), kAudioFileWAVEType, &(dstFormat), NULL, kAudioFileFlags_EraseFile, &recordingFilRef);

        // tell the EXtAudio File ApI  what format we will be sending samples
        //recordasbd is the asbd of incoming packets populated in  AudioFileStream_PropertyListenerProc
        status =   ExtAudioFileSetProperty(recordingFilRef, kExtAudioFileProperty_ClientDataFormat, sizeof(recordasbd), &recordasbd);  
    }
    // a handler called by packetproc call back function in AudiofileStreamOpen 
    - (void)handlePacketsProc:(const void *)inInputData numberBytes:(UInt32)inNumberBytes numberPackets:(UInt32)inNumberPackets packetDescriptions:(AudioStreamPacketDescription *)inPacketDescriptions {
    if(recording){
         // wrap the destination buffer in an audiobuffer list
         convertedData.mNumberBuffers= 1;
         convertedData.mBuffers[0].mNumberChannels = recordasbd.mChannelsPerFrame;
         convertedData.mBuffers[0].mDataByteSize = inNumberBytes;
         convertedData.mBuffers[0].mData = inInputData;


       ExtAudioFileWrite(recordingFilRef,recordasbd.mFramesPerPacket * inNumberPackets, &convertedData);
         }

    }

Мои вопросы:

Правильно ли подходит мой подход, можно ли записывать mp3-файлы в wav-файл таким образом? Если да, то чего мне не хватает??

Если мой подход неверен, скажите, пожалуйста, каким-либо другим способом, который вы считаете правильным. Для меня более чем достаточно толчка в правильном направлении.

Я так благодарен за любую помощь, что я прочитал каждый SO вопрос, который я мог получить в этой теме, я также внимательно посмотрел на пример Convertfile яблок, но я не мог понять, что мне не хватает, Заранее благодарен за любую помощь

1 ответ

Почему бы не записать сырые mp3-пакеты прямо в файл? Без использования ExtAudioFile совсем.

Они сформируют правильный файл mp3 и будут намного меньше, чем эквивалентный файл wav.

Другие вопросы по тегам