Ich versuche, eine Videodatei mit AVAssetReader zu lesen und das Audio an CoreAudio zur Verarbeitung weiterzuleiten (Effekte und andere Sachen hinzufügen), bevor ich es mit AVAssetWriter wieder auf die Festplatte speichere. Ich möchte darauf hinweisen, dass, wenn ich die Komponente SubType auf AudioComponentDescription meines Ausgabeknotens als RemoteIO festlegen, Dinge über die Lautsprecher korrekt abgespielt werden. Das macht mich zuversichtlich, dass mein AUGraph richtig eingerichtet ist, da ich Dinge hören kann. Ich setze den subType auf GenericOutput obwohl ich das Rendering selbst machen kann und das angepasste Audio zurückbekomme.
Ich lese das Audio ein und gebe CMSampleBufferRef an copyBuffer aus. Dadurch wird das Audio in einen Ringpuffer gelegt, der später eingelesen wird.
%Vor%Als nächstes rufe ich processOutput auf. Dies führt einen manuellen Reder für die Ausgabeeinheit aus. Wenn AudioUnitRender aufgerufen wird, ruft es den playbackCallback auf, der als Eingabe-Callback auf meinem ersten Knoten angeschlossen ist. playbackCallback holt die Daten aus dem Ringspeicher und gibt sie in die übergebene audioBufferList ein. Wie bereits erwähnt, wenn der Ausgang als RemoteIO eingestellt ist, wird der Ton korrekt auf den Lautsprechern wiedergegeben. Wenn AudioUnitRender beendet ist, gibt es noErr zurück und das BufferList-Objekt enthält gültige Daten. Wenn ich CMSampleBufferSetDataBufferFromAudioBufferList aufruft, bekomme ich kCMSampleBufferError_RequiredParameterMissing (-12731) .
%Vor%Die CMSampleBufferRef, die ich übergebe, sieht gültig aus (unten ist ein Dump des Objekts vom Debugger)
%Vor%Die Pufferliste sieht so aus
%Vor%Wirklich ratlos hier, hoffend, dass jemand helfen kann. Danke,
Falls es wichtig ist, debugge ich dies in IOS 8.3 Simulator und das Audio kommt von einem mp4, das ich auf meinem iPhone 6 aufgenommen habe und dann auf meinem Laptop gespeichert habe.
Ich habe die folgenden Ausgaben gelesen, aber immer noch ohne Erfolg, die Dinge funktionieren nicht.
Wie konvertiert man AudioBufferList in CMSampleBuffer?
Das Konvertieren einer AudioBufferList in einen CMSampleBuffer führt zu unerwarteten Ergebnissen
CMSampleBufferSetDataBufferFromAudioBufferList gibt den Fehler 12731 zurück
Kern-Audio-Offline-Rendering GenericOutput
AKTUALISIEREN
Ich habe noch etwas herumgestöbert und festgestellt, dass wenn meine AudioBufferList direkt vor AudioUnitRender läuft, es so aussieht:
%Vor%mDataByteSize ist numberFrames * sizeof (SInt32), was 512 * 4 ist. Wenn ich mir die AudioBufferList anschaue, die in playbackCallback übergeben wurde, sieht die Liste so aus:
%Vor%nicht wirklich sicher, wo der andere Puffer geht, oder die andere 1024 Byte Größe ...
wenn ich fertig bin, Redner anzurufen, wenn ich sowas mache
%Vor%und übergeben Sie newbuff an CMSampleBufferSetDataBufferFromAudioBufferList der Fehler verschwindet.
Wenn ich versuche, die Größe von BufferList auf 1 mNumberBuffers oder seine mDataByteSize auf numerrames * sizeof (SInt16) zu setzen, erhalte ich beim Aufruf von AudioUnitRender eine -50
UPDATE 2
Ich habe einen Render-Callback angeschlossen, damit ich den Ausgang überprüfen kann, wenn ich den Sound über die Lautsprecher abspiele. Ich habe bemerkt, dass die Ausgabe, die zu den Lautsprechern geht, auch eine AudioBufferList mit 2 Puffern hat und die mDataByteSize während des Eingabe-Callbacks 1024 ist und im Render-Callback seine 2048, die die gleiche ist, die ich beim manuellen Aufruf von AudioUnitRender gesehen habe. Wenn ich die Daten in der gerenderten AudioBufferList überprüfe, bemerke ich, dass die Bytes in den 2 Puffern gleich sind, was bedeutet, dass ich den zweiten Puffer einfach ignorieren kann. Aber ich bin mir nicht sicher, wie ich mit der Tatsache umgehen soll, dass die Daten 2048 groß sind, nachdem sie gerendert wurden, anstatt 1024, wenn sie aufgenommen werden. Irgendwelche Ideen, warum das passieren könnte? Ist es nach dem Durchlaufen der Audiodiagramm eher in roher Form und deshalb verdoppeln sich die Größen?
Klingt wie das Problem, mit dem Sie es zu tun haben, wegen einer Diskrepanz in der Anzahl der Kanäle. Der Grund, warum Sie Daten in Blöcken von 2048 statt 1024 sehen, liegt daran, dass Sie zwei Kanäle (Stereo) zurückspeisen. Stellen Sie sicher, dass alle Audiogeräte ordnungsgemäß für die Verwendung von Mono im gesamten Audiodiagramm konfiguriert sind, einschließlich der Tonhöheneinheit und allen Audioformatbeschreibungen.
Eine Sache, vor der Sie sich besonders hüten sollten, ist, dass Aufrufe von AudioUnitSetProperty
fehlschlagen können - also stellen Sie sicher, dass Sie diese auch in CheckError()
einfügen.
Tags und Links ios core-audio cmsamplebufferref audiobufferlist