Verwenden des FFmpeg-Filters ohne Videokonvertierung

7

Hat jemand eine Idee, wie ich eine Bildmaske über das Video legen kann, ohne den Audio- und Video-Codec zu ändern?

Ich erstelle verschiedene Mediendateien zu Testzwecken und möchte die Kontrolle über meine Audio- und Videocodecs haben, die in einem A / V-Container verwendet werden. Jetzt muss ich eine Bildmaske über eine A / V-Datei legen, ohne den Audio- und Videocodec zu ändern .

Bei Verwendung ffmpeg -i video.avi -i image.png -filter_complex 'overlay' avi.mkvkann ich hinzufügen, -acodec copyaber nicht -vcodec copy, dies gibt den Fehler:

Streamcopy für Ausgangsstreaam 0: 0 angefordert, der von einem komplexen Filtergraphen gespeist wird. Filterung und Streamcopy können nicht zusammen verwendet werden.

Und wenn ich nur den obigen Befehl benutze, codiert FFmpeg meine Streams in ein anderes Format (MPEG-4 & MP3).

Jan Claes
quelle

Antworten:

8

Sie haben Ihre eigene Frage beantwortet: Filter sind nicht kompatibel mit copy. Sie verwenden dort einen Videofilter, können also also nicht -vcodec copyoder verwenden -c:v copy. wenn Sie eine Audio - Filter verwendet haben , würden Sie nicht in der Lage zu verwenden -acodec copyoder -c:a copy.

copyKopiert, wie der Name schon sagt, den genau angegebenen Stream ohne Änderungen. Filter ändern die Streams, auf die sie abzielen. Per Definition sind copyFilter nicht kompatibel.

Wenn Sie einfach einen bestimmten Video-Codec auswählen möchten, ist dies einfach genug: Verwenden Sie -c:v [codecname]; Sie können eine Liste aller Codecs sehen, die Ihr ffmpeg unterstützt

ffmpeg -codecs
Übelsuppe
quelle
3
Dies scheint jedoch eine schlechte Architektur zu sein. Was ist beispielsweise, wenn ich einen "setpts = 2 * PTS" -Filter ausführen möchte, um das Video zu verlangsamen? Das sollte nur mit Demuxing und Muxing laufen können und sollte keine Transcodierung erfordern! (Da nicht auf die Pixeldaten zugegriffen wird, sondern nur auf die Frame-Metadaten).
AlcubierreDrive
3
@EvolvedAI Das ist ein guter Punkt, und ffmpeg unterstützt Bitstromfilter , die beim Kopieren von Streams verwendet werden können . Ich vermute, dass dies nur ein Fall ist, in dem niemand dazu gekommen ist, einen Bitstromfilter zu schreiben, der dies tut, da es sich um eine ziemlich nischenhafte Verwendung von ffmpeg handelt und außerhalb des Hauptzwecks des Tools liegt. Vielleicht sollten Sie dies auf die Mailingliste der ffmpeg-Benutzer setzen und / oder eine Anfrage auf ihrem Bug-Tracker einreichen .
Evilsoup
0

Falls es jemandem hilft, sollte beachtet werden, dass es wahrscheinlich eine etwas hässliche Möglichkeit gibt, das zu tun, was Sie wollen, indem Sie Bash kombinieren ffprobeund ffmpegverwenden. Wenn Sie ffmpeginstalliert haben, haben Sie wahrscheinlich ffprobeauch. Als einfaches Nur-Audio-Beispiel hat das Folgende für mich funktioniert, obwohl im Prinzip etwas Ähnliches mit mehreren Streams unterschiedlicher Art erreichbar sein sollte.

ffmpeg -i neil_young_tell_me_why.wav -af aresample=resampler=soxr:precision=33:cheby=true -ar 96000 -acodec `ffprobe -v error -show_entries:a:0 stream=codec_name -of default=noprint_wrappers=1:nokey=1 neil_young_tell_me_why.wav | xargs echo -n` neil_young_tell_me_why_96Kup.wav

Erläuterung: Die Ausgabe des ffprobeBefehls innerhalb der Backticks wird direkt erweitert, um 0 des Audio-Codecs der Eingabedatei zu streamen, wobei die neue Zeile von entfernt wird xargs. ffprobewurde so eingestellt, dass nur eine minimale Textmenge ausgegeben wird, und die Ausgabe des ffprobeStandard- "Writers" wurde so konfiguriert, dass beim Schreiben auf den Bildschirm alle anderen überflüssigen Texte wie Beschriftungen usw. entfernt werden.

Ich wollte das Resampling mit höherer Qualität mit dem SoXResampler testen, also habe ich eine WAV-Datei von 44,1 kHz auf 96 kHz hochgesampelt, während ich den gleichen Codec beibehalten habe. Ohne dies zu tun, hatte der Codec, der automatisch von ausgewählt wurde, ffmpegeine geringere Bittiefe, wodurch die Auflösung von 24 Bit auf 16 Bit sank. Auf diese Weise gab es keinen Präzisionsverlust.

clone206
quelle