Frage

Ich mache einige Fortschritte auf einen komprimierten (mp3) Ton zu nehmen und es als PCM-Speicher. Außerdem wollte ich die Original-Datei in Stücke geteilt, die 2 Sekunden lang sind, innerhalb des gleichen Prozesses. Ich scheine erfolgreich zu sein, aber ich bin ein wenig verwirrt, warum.

Als ich Blöcke von Audio lesen und schreiben, die Dateien aus, ich überprüfen, um zu sehen, ob ich über ein Stück zu schreiben, die meine Datei meine 2 Sekunden Grenze überschreiten würde. Wenn ja, ich genug schreiben bis 2 Sekunden zu erhalten, schließen Sie die Datei, und dann eine neue Datei öffnen und den Rest in die neue Datei schreiben, und dann mehr Daten lesen. So etwas wie folgt aus:

framesInTimedSegment += numFrames;
if ((framesInTimedSegment  > (2.0 * sampleRate)) && (j < 5)) {
    UInt32 newNumFrames = numFrames;
    numFrames = framesInTimedSegment - (2.0 * sampleRate);
    newNumFrames -= numFrames;
// Question A
    UInt32 segmentOffset = newNumFrames * numChannels * 2;
    error = ExtAudioFileWrite(segmentFile, newNumFrames, &fillBufList);
// Question B
       // handle this error!  We might have an interruption
    if (segmentFile) ExtAudioFileDispose(segmentFile);
    XThrowIfError(ExtAudioFileCreateWithURL(urlArray[++j], kAudioFileCAFType, &dstFormat, NULL, kAudioFileFlags_EraseFile, &breakoutFile), "ExtAudioFileCreateWithURL failed! - segmentFile");
    size = sizeof(clientFormat);
    XThrowIfError(ExtAudioFileSetProperty(segmentFile, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat), "couldn't set destination client format"); 
    fillBufList.mBuffers[0].mData = srcBuffer + segmentOffset;
    fillBufList.mBuffers[0].mDataByteSize = numFrames * fillBufList.mBuffers[0].mNumberChannels * 2;
    framesInTimedSegment = numFrames;
}
error = ExtAudioFileWrite(segmentFile, numFrames, &fillBufList);

Hier sind meine Fragen (Ich habe versucht, die entsprechende Zeile zu markieren):

A: Gibt es eine bessere Art und Weise die in meinem Puffer versetzt zu finden, damit ich dort einen gewissen Wert nicht fälschlicherweise hart Code tun? Zum Beispiel ist es eine gesegnete Weise der Daten versetzten Rahmennummer zu bekommen?

B: Wenn ExtAudioFileWrite die Konvertierung von Druck tut zu dekomprimiert, dann die Daten, die ich schreibe, hat noch nicht dekomprimiert worden ist (oder?), So sollte ich nicht über das Spielen mit Rahmennummern kümmern und Offsets, wenn ich mit komprimierten Daten zu tun habe? Sollte ich stattdessen zuerst die Datei umstellen, entweder auf eine PCM-Datei oder in den Speicher und dann aufgeteilt, dass PCM?

Danke!

-mahboud

ps.

Die clientFormat ist wie folgt definiert:

        clientFormat = dstFormat;

und dstFormat:

        dstFormat.mFormatID = outputFormat;
        dstFormat.mChannelsPerFrame = srcFormat.NumberChannels();
        dstFormat.mBitsPerChannel = 16;
        dstFormat.mBytesPerPacket = dstFormat.mBytesPerFrame = 2 * dstFormat.mChannelsPerFrame;
        dstFormat.mFramesPerPacket = 1;
        dstFormat.mFormatFlags = kLinearPCMFormatFlagIsPacked | kLinearPCMFormatFlagIsSignedInteger; // little-endian
War es hilfreich?

Lösung

Es ist schwierig, richtig zu beantworten, ohne ein bisschen mehr Code zu sehen. Aber clientFormat unter der Annahme, ein verschachteltes PCM-Format:

B) ExtAudioFileWrite nicht die Konvertierung nicht durchführt zur dekomprimiert komprimiert, does- ExtAudioFileRead je nachdem, welche Client-Format, das Sie festgelegt haben. Unter der Annahme eine MP3-Quelldatei und ein „Standard“ 16-Bit 44,1 kHz PCM-Client-Formats, ruft ExtAudioFileRead von dem MP3-Bytes zu PCM-Daten konvertieren. Dies geschieht unter der Haube getan, indem Sie Audiofile und Audioconverter APIs.

A) Das ist ein bisschen schwer zu beantworten, ohne zu sehen, wie srcBuffer definiert ist (ich nehme an eine Reihe von int16_t). Wenn Sie mit PCM-Daten arbeiten, was Sie tun, sieht nicht gut aus. Sie könnten auch newNumFrames * clientFormat.mBytesPerFrame * clientFormat.mChannelsPerFrame verwenden, aber unter der Annahme, 16-Bit-PCM-Daten, mBytesPerFrame == == mBytesPerPacket 2. Wenn Sie mit nicht-CBR-Daten arbeiten Sie würden sie mit Paketbeschreibungen müssen betreffen, aber das scheint nicht der Fall zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top