Wie Video4Linux und ALSA mit Codecs arbeiten

2483
pnongrata

Ich verstehe, dass ein Codec sowohl ein Decodierer als auch eine Spezifikation für die Decodierung ist. So schreibt einige Gruppe einen Codec, der erklärt, wie dekodieren von ihrem Format zurück in den Raw - Bitstream, und sie verlassen die Codierung Implementierung bis zu jeder, der einen kompatiblen Encoder schreiben will. So ist beispielsweise h.264 ein bekannter Video-Codec (Decoder) und x264 ist ein bekannter FOSS-Encoder für h.264. Es gibt jedoch viele andere h.264-Encoder.

Ich verstehe, dass es sich bei VideoForLinux (V4L2) um eine Suite von Kernel- und User-Space-Bibliotheken für die Arbeit mit Video-Streaming auf Linux-Computern handelt.

Mein Verständnis ist, dass ALSA ist eine Suite von Kernel- und User-Space - Bibliotheken für die Arbeit mit Audio-Streaming auf Linux - Rechnern.

Wenn etwas, das ich oben angegeben habe, nicht korrekt ist, korrigieren / klären Sie mich bitte zuerst!

Vorausgesetzt, ich bin mehr oder weniger korrekt, kann ich nicht erkennen, welche Rolle V4L2 und ALSA (wenn überhaupt) spielen müssen, wenn versucht wird, Audio- und Video-Bitstreams auf einem Linux-Computer zu kodieren, zu komprimieren und zu übertragen.

Wenn ich x264 zum Kodieren meines Videostreams verwenden könnte, faac zum Kodieren meines Audiostroms und dann ffmpegzum Komprimieren, Muxen und Übertragen der zwei Streams in einem MPEG-TS-Container, wo kommen dann V4L2 und ALSA ins Spiel?

Und wenn die Antwort „sie nicht“, dann könnte jemand bitte ein Beispiel oder zwei geben, wenn V4L2 / ALSA würde verwendet werden, so kann ich sie in Zusammenhang bringen und verstehen, die Anwendungsfälle, wo sie benötigt werden? Danke im Voraus.

2

2 Antworten auf die Frage

1
Frank Thomas
  1. Die Feinheiten der Codecs beginnen mit der Festlegung des Formats und der Methodik für die Codierung und Decodierung, einschließlich der API-Spezifikationen, sofern zutreffend. Daraus können Implementierungen sowohl des Codierers als auch des Decodierers erstellt werden. Nicht alle Implementierungen werden gleich erstellt. Zum Beispiel ist der CoreAVC H.264-Decoder Multithreading, während dies bei vielen anderen Implementierungen nicht der Fall ist.

  2. V4L2 wird hauptsächlich zum Erstellen / Erfassen von Video auf Linux-Systemen verwendet, daher ist ein Encoder integriert (oder es wird mit größerer Wahrscheinlichkeit ein externer verwendet). Es wird hauptsächlich für Webcams und Video-Capture- / TV-Karten verwendet. Mehr auf Wikipedia . Apps, die Raw-Streams erstellen, verwenden V4L2, um das Video nach ihrem Geschmack zu kodieren. Die Dekodierung erfolgt durch ein anderes Paket (vielleicht libavcodec).

  3. ALSA enthält Codecs, ist aber selbst der Support-Stack für alle Audio-Vorgänge in Linux. Wo immer Sie auch Ton hören, ist ALSA das, was dies ermöglicht. Ich bin sicher, dass ALSA Komponenten für den Audioeingang (Mic / Line-In) hat, also muss es in irgendeiner Form kodiert werden können, aber ich habe damit nicht gearbeitet.

In Ihrem Beispiel glaube ich nicht, dass V4L2 überhaupt eine Rolle spielt, da Sie einen H.264-Encoder verwenden, der wahrscheinlich eine viel bessere Qualität und Leistung bietet als V4L2. ALSA wird zur Wiedergabe Ihres Videos verwendet, aber nicht zum Kodieren.

Wenn Sie einen Sound abspielen, ist ALSA am Werk. Wenn Sie Ihre Webcam verwenden, ist L4V2 am Werk.

0
LordNeckbeard

As for ffmpeg, ALSA and V4L2 are called input devices, not codecs (not that the term codec is always accurate—I generally call something an encoder and/or decoder to be more specific). Other input devices include JACK, pulse, x11grab, iec61883, dv1394, etc. From the FFmpeg documentation:

Input devices are configured elements in FFmpeg which allow to access the data coming from a multimedia device attached to your system.

For example, you can use ALSA to capture audio from a microphone that is plugged into your audio card. You can use V4L2 to capture video from a webcam. Basic, untested example command:

ffmpeg -f video4linux2 -i /dev/video0 -f alsa -i hw:0 output.mkv 

You mention:

h.264 is a famous video codec (decoder)

H.264 is a standard, not a codec. FFmpeg has a decoder named h264. It can be confusing. See What is a Codec (e.g. DivX?), and how does it differ from a File Format (e.g. MPG)?