2016-05-06 6 views
0

Problem ffmpegBester Weg, um Rohr Audio- und Videostücke aus Python

Ich erhalte Audio- und Videostücke von einem Drittanbieter-Server, und ich mag diese Brocken Rohr ffmpeg eine erstellen WebM Live-Stream nach dieser Anleitung:

http://wiki.webmproject.org/adaptive-streaming/instructions-to-do-webm-live-streaming-via-dash

Hier sind sie Eingang verwenden von Webcam und Mikrofon, aber ich brauche die Datenblöcke zu verwenden, so dass der ffmpeg Befehl wie dies irgendwie aussehen würde:

cmd = [ 
     "ffmpeg", 
     "-f", "flv", "-i", "video.fifo", 
     "-f", "s16le", "-ar", "16000", "-ac", "1", "-i", "audio.fifo", 
     "-map", "0:0", 
     "-pix_fmt", "yuv420p", 
     "-c:v", "libvpx-vp9", 
     "-s", "640x480", "-keyint_min", "40", "-g", "40", "-speed", "6", 
     "-tile-columns", "4", "-frame-parallel", "1", "-threads", "8", 
     "-static-thresh", "0", "-max-intra-rate", "300", 
     "-deadline", "realtime", "-lag-in-frames", "0", 
     "-error-resilient", "1", 
     "-b:v", "3000k", 
     "-f", "webm_chunk", 
     "-header", self.video_header, 
     "-chunk_start_index", "1", 
     "video_360_%d.chk", 
     "-map", "1:0", 
     "-c:a", "libvorbis", 
     "-b:a", "16k", "-ar", "16000", 
     "-f", "webm_chunk", 
     "-audio_chunk_duration", "2000", 
     "-header", self.audio_header, 
     "-chunk_start_index", "1", 
     "audio_171_%d.chk" 
    ] 

Wie Sie sehen können, verwende ich eine "video.fifo" und "audio.fifo" -Datei, weil ich dachte, es wäre eine gute Idee, die Stücke über eine Named Pipe zu pumpen, aber ich kann t es zur Arbeit bringen. Hier ist, was ich tue:

p = subprocess.Popen(cmd) 
fa = os.open("video.fifo", os.O_WRONLY) 
fv = os.open("audio.fifo", os.O_WRONLY) 

Also zuerst die subprocess Ich fange an, so dass es die Fifo-Dateien zum Lesen geöffnet. Danach sollte ich in der Lage sein, sie zum Schreiben zu öffnen, aber ich bin es nicht. Genauer gesagt, ich kann den ersten öffnen, aber nicht den zweiten. Vielleicht hat das etwas damit zu tun, wie ffmpeg seine Eingaben verarbeitet, wenn es mehrere gibt, aber ich weiß es einfach nicht.

Frage

Wie ich entweder das Problem der nicht zu öffnenden Named Pipes lösen können oder wie kann ich erreichen, was ich ohne Named Pipes erreichen wollte.

Antwort

0

Die Anweisungen in Ihrem Link empfehlen, ffmpeg im Hintergrund auszuführen. Von der ffmpeg-man-Seite:

-stdin

Aktivieren Interaktion auf der Standardeingabe. Ein, wenn die Standardeingabe nicht als Eingabe verwendet wird. Um die Interaktion explizit zu deaktivieren, müssen Sie "-nostdin" angeben.

Die Deaktivierung der Interaktion auf der Standardeingabe ist beispielsweise nützlich, wenn sich ffmpeg in der Hintergrundprozessgruppe befindet. Etwa das gleiche Ergebnis kann mit "ffmpeg ... </dev/null" erreicht werden, aber es erfordert eine Shell.

Ich hatte ein ähnliches Problem vor nicht allzu langer Zeit. Bei der Verarbeitung mehrerer Eingaben würde ffmpeg beim ersten Mal wie erwartet funktionieren und danach jedes Mal Fehler werfen. Das Hinzufügen von -nostdin zu Ihren globalen Argumenten oder </dev/null sollte das Problem beheben. Abgesehen von all den Schnickschnack, sollte einer der folgenden Schritte funktionieren.

ffmpeg [in-args][input][out-args][output] & </dev/null

ffmpeg [-nostdin in-args][input][out-args][output] &

Hoffnung, das hilft.

Verwandte Themen