Ich lerne, wie man MP4-Videos aus diesem -Beispiel erstellt. Das Problem ist, dass das Beispiel zeigt Audiocodierung von einigen Dummyquelldaten, die im Flug erzeugt werden. Ich muss Audio von einer Datei kodieren. Ich habe viele Beispiele überprüft und die meisten von ihnen zeigen die gleiche oder gerade eine unterschiedliche Audiocodierung. In meinem Trial-and-Error-Prozess verwende ich den gleichen AVFormatContext für Audio- und Videoframes.Ich bin mir nicht sicher, ob es richtig ist, oder sollte ich lieber zwei separate Kontexte haben? Bisher habe ich Video-Codierung in Ordnung, aber Audio-Stream fehlgeschlagen da AVPacket den korrekten Audio-Stream-Index nicht finden kann. Hier ist, wie ich Audio-Stream einrichten:
%Vor%Hier ist "oc" derselbe Kontext, der auch zum Initialisieren des Videostreams verwendet wird.
Dann versuche ich, Audio-Frame wie folgt zu schreiben:
%Vor%Das Ding ist, dass ich diese Aussage niemals überlasse: "if (pkt.stream_index == st- & gt; index)". Der Paket-Stream-Index ist niemals gleich dem Audio-Stream-Index. Kann jemand darauf hinweisen, wo ich falsch liege? / p>
UPDATE:
Ich habe zwar den Input-Audio-Stream zum Encoding geöffnet, aber ich kann Audio- und Video-Streams nicht in einzelne Outputs codieren. Was ich sehe, sind vermutlich die Quelle des Problems. Derzeit berechne ich basierend auf Muxing Punkte. c Beispiel, aber es funktioniert überhaupt nicht für Audio.
Hier ist, wie ich es benutze:
%Vor%Irgendwie, sobald ich in der Audio-Encoding-Schleife bin, erreicht die audio_pts nie die video_pts und ist immer Null:
%Vor%Also stelle ich im Grunde dieselbe Frage erneut: Wie funktioniert das Muxen, wenn Audio von einer externen Datei kommt?
Übrigens hilft die folgende Antwort nicht, da angenommen wird, dass sowohl Audio- als auch Videostreams von derselben Datei stammen, während in meinem Fall nur Audio von der externen Quelle kommt.
Sie können aus demselben Kontext machen, dass kein separater Kontext benötigt wird. Wenn Sie sowohl Video als auch Audio codieren. Dann müssen Sie zuerst den Videostream und dann den Audiostream erstellen. Wenn Sie jedoch nur Audiodaten codieren möchten, müssen Sie nur einen Audiodatenstrom erstellen. if (pkt.stream_index == st- & gt; index) wird normalerweise benötigt, wenn Sie umcodieren, d. h. wenn Sie das Format des Änderungscontainers verwenden. In dem können Sie Frame aus einer Videodatei lesen und in eine andere Datei schreiben, also müssen Sie wissen, ob der Frame aus Audio- oder Video-Stream stammt. Wenn Sie jedoch entschlüsselte Audiopakete erhalten, müssen Sie den richtigen Stromindex im Audiopaket festlegen, bevor Sie av_interleaved_write ausführen.
In Ihrem Code setzen Sie keine pts und dts von Audiopaketen, die für eine korrekte Codierung benötigt werden.
Vor einiger Zeit habe ich ein ähnliches Programm wie du geschrieben, du kannst es dir als Referenz ansehen.
%Vor%Sie können die AVBlocks-Bibliothek ( Beispiel <) verwenden / a>). Ich habe den Beispielcode verwendet, um das gleiche Problem zu lösen.
Für die korrekte Arbeit nicht nur mit .aac habe ich einige Änderungen in StreamType :: * und StreamSubType :: *
vorgenommenTags und Links c++ audio ffmpeg video-encoding