2017-05-07 9 views
1

온라인 라디오 응용 프로그램에서 작업하고 있습니다. AudioQueueServices를 사용하여 Icecast 서버에서 스트리밍 된 MP3 패킷을 재생할 수있었습니다. 녹음 기능을 구현하는 데 어려움을 겪고 있습니다.ExtAudioFileWrite를 사용하여 wav 파일에 스트리밍 된 mp3 패킷 버퍼 작성하기

스트리밍이 mp3 형식이기 때문에 AudioFileWritePackets를 사용하여 오디오 패킷을 파일에 직접 쓸 수 없습니다.

확장 오디오의 자동 변환 ExtAudioWriteFile을 사용하여 wav 파일에 쓰고 있습니다. 나는 FileStreamOpen 콜백 함수 AudioFileStream_PropertyListenerProc을 사용하여 수신 패킷의 AudioStreamBasicDescription을 설정하고 수동으로 채워지는 대상 형식을 작성했습니다. 코드는 파일을 성공적으로 생성하고 패킷을 재생하지만 재생시 화이트 노이즈가 들립니다. 여기

// 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 질문 I을 읽고 어떤 도움 너무 감사하고 나를 위해 충분한 이상입니다 이 주제에 관한 나의 손을 잡을 수 있었고, 또한 사과를 자세히 보았습니다. Convertfile 예를 들어 보았지만, 내가 놓친 것을 알아낼 수 없었습니다. 도움을 주셔서 미리 감사드립니다.

답변

0

원시 mp3 패킷을 파일에 직접 쓰지 않는 이유는 무엇입니까? ExtAudioFile을 전혀 사용하지 않고.

그들은 유효한 mp3 파일을 형성하며 동등한 wav 파일보다 훨씬 작습니다.

+0

저작권 문제로 인해 Apple에서 mp3를 지원하지 않습니다 .AudiofileCreateWithurl이 'fmt?'(kAudioConverterErr_FormatNotSupported) 상태를 반환하므로 wav로 변환하려고합니다. –

+0

'fwrite','write' 또는'NSFileHandle' 메소드를 사용하여 원시 패킷을 파일에 쓰는 것을 의미합니다. Apple은 mp3 데이터 인코딩을 지원하지 않습니다. 이유는 지정되지 않았지만 이미 mp3 데이터를 가지고 있기 때문에 인코더가 필요하지 않습니다. 그들은 그것을 디코딩하는 것을지지합니다. –