2012-04-13 15 views
0

Ich versuche, rohe Pufferdaten in eine Audiodatei zu erfassen. Wie folgt aus:Audio in Datei aufnehmen ExtAudioFileWrite

dstFormat.mSampleRate = 224000; 
dstFormat.mFormatID = kAudioFormatMPEG4AAC; 
dstFormat.mChannelsPerFrame = 1; 
dstFormat.mBitsPerChannel = 16; 
dstFormat.mBytesPerPacket = dstFormat.mBytesPerFrame = 2 * dstFormat.mChannelsPerFrame; 
dstFormat.mFramesPerPacket = 1; 
dstFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger;  
OSStatus result = ExtAudioFileCreateWithURL((CFURLRef) inURL, 
              kAudioFileM4AType, 
              &dstFormat, 
              0, 
              kAudioFileFlags_EraseFile, 
              &audioFileRef) 

bin ich in eine Funktion mit den folgenden Parametern angeschlossen: AudioUnit inUnit, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inOutputBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData

Im Innern Ich versuche, die Daten in die Datei zu schreiben, aber ein schlechter Parameter -50 Fehler auftritt. Ergebnis = ExtAudioFileWrite (audioFileRef, inNumberFrames, ioData);

Wenn ich IODATA Parameter mit meinem eigenen ersetzen:

AudioBufferList *bufferList = (AudioBufferList*) malloc(sizeof(AudioBufferList)); 
    bufferList->mNumberBuffers = 1;// ioData->mNumberBuffers; 
    for(UInt32 i=0;i<bufferList->mNumberBuffers;i++) 
    { 
     bufferList->mBuffers[i].mNumberChannels = 1; 
     bufferList->mBuffers[i].mDataByteSize = ioData->mBuffers[i].mDataByteSize; //ioData->mBuffers[i].mDataByteSize; // (1024*2) * dstFormat.mBytesPerFrame; 
     bufferList->mBuffers[i].mData = ioData->mBuffers[i].mData; 
    } 

.. ich bekomme Datei um 260MB für die erste Sekunde. Was ist hier falsch?

Antwort

1

Ich bin überrascht, dass das iPhone sogar eine Audiodatei mit diesen Parametern erstellen wird, obwohl ich vermute, dass das ist, weil Sie es bisher nur im Simulator und nicht auf Hardware getestet haben. Wie auch immer, dein Stream-Format ist hier das Problem.

Wenn Sie Rohdaten erfassen, warum sollten Sie die Format-ID auf m4a setzen, aber dann die Format-Flags auf lineare PCM setzen? Ich bin mir auch nicht sicher, wie Sie zu einer Abtastrate von 224 kHz gekommen sind, aber es wird Sie in Schwierigkeiten bringen und zumindest teilweise erklären, warum die Größe der Ausgabedatei so groß ist.

Ich würde vorschlagen, ein wenig herum zu googlen, um einige Beispiele der Stream-Beschreibung Struktur zu sehen, wie es ein bisschen kompliziert ist. Diese Frage könnte auch Ihnen helfen, auf dem richtigen Weg:

CoreAudio - kAudioFileUnsupportedDataFormatError

+0

danke mann, ich habe bereits das prob, aber du hast mir eine gute antwort –

+0

Froh zu hören du hast es funktioniert. Was war das Problem genau? Sie sollten den Arbeitscode veröffentlichen. :) –

+0

http://stackoverflow.com/questions/3815231/recording-mono-on-iphone-in-ima4-format Dieser Beitrag hat mir sehr geholfen –

1

ich heraus, dachte nur, wie vor mit dem AAC-Format ein paar Tage zu schreiben. Details + Code hier: Recording to AAC from RemoteIO: data is getting written but file unplayable

Ich habe nur dieses auf iOS getestet 5 in der iPad-Simulator + iPad 2. Die Leistung ist groß, und ich habe großen Respekt vor den Fähigkeiten Core Audio, aber meine Güte ... Apple könnte es dokumentieren ein bisschen mehr.

Verwandte Themen