Pipe-Webcam-Video-Stream-Daten zur Verarbeitung

3

Ich habe festgestellt, dass man unter Linux video4linux2 und ffmpeg verwenden kann, um die Daten aus / dev / video0 zu lesen und das Video von der Webcam zu holen. ffmpeg gibt die Daten in eine Videodatei mit begrenzter Länge aus. Meine Frage ist:

Kann ich den Videostream sowohl zum Remote-Viewer als auch zu einem lokalen Programm leiten, damit ich die Stream-Daten weiterhin in Echtzeit verarbeiten kann?

Vielen Dank.

vivienlwt
quelle
Sie sollten immer Ihren Befehl ffmpeg und die gesamte Konsolenausgabe angeben, oder, falls Sie keinen Befehl haben, zumindest einige Informationen zur Eingabe (einschließlich der gesamten Konsolenausgabe):ffmpeg -f v4l2 -i /dev/video0
llogan

Antworten:

2

Dies ist mit dem Tee Muxer möglich . Geändertes Beispiel aus der Dokumentation:

ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -c:a mp2 -f tee -map 0:v -map 0:a \
"archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"

Beachten Sie, dass die Streams explizit zugeordnet werden müssen, weshalb dies -maperforderlich ist.

Siehe auch:

Logan
quelle
Danke das. Ich überlege mir den anderen Teil meiner Frage, ob die Verarbeitung des Videostreams in Echtzeit gelöst werden kann, indem der Stream an localhost weitergeleitet wird und ffmpeg-Bibliotheken verwendet werden , um den Stream unter Angabe der Quelle zu verarbeiten. Wenn dies nicht funktioniert, muss ich andere Ansätze finden.
Vivienlwt
@vivienlwt Ich habe keine Erfahrung mit den Bibliotheken, aber Sie möchten möglicherweise auch die aktualisierte Quellcode- Version des Dranger-Tutorials und sehen doc/examples.
Logan
Vielen Dank für den Link :) Ich habe das Dranger-Tutorial gesehen, aber Ihr Link ist der aktuellste Quellcode.
Vivienlwt
0

Ich fand die Antwort von diesem Link , um Webcam als Eingang für Video zu erhalten (mit Bibliothek). Sie müssen nur die Parameter in der Funktion avformat_open_input () definieren.

Zunächst wird die Geräteregistrierung importiert:

avdevice_register_all();

Dann definieren Sie das Eingabeformat:

AVInputFormat *inputFormat =av_find_input_format("v4l2");

Möglich, andere Optionen einzustellen:

AVDictionary *options = NULL;

av_dict_set(&options, "framerate", "25", 0);

Endlich:

avformat_open_input(&pFormatCtx, "/dev/video0", inputFormat, &options);

Danach können Sie jeden von der Eingangsquelle gelesenen und decodierten Frame entweder an das Display oder an eine andere benutzerdefinierte Funktion übergeben.

Hoffe das ist hilfreich für die anderen.

vivienlwt
quelle