2017-12-12 3 views
0

Ich möchte in der Lage sein, Bilder on the fly zu erstellen und auch Audio on the fly zu erstellen und in der Lage zu sein, sie zu einem RTMP-Stream (für Twitch oder YouTube) zu kombinieren. Das Ziel ist, dies in Python 3 zu erreichen, da dies die Sprache ist, in der mein Bot geschrieben ist. Bonuspunkte, um nicht auf der Festplatte zu speichern.Kombiniere Audio und Bilder in Stream

Bisher habe ich herausgefunden, wie zu rtmp-Servern mit ffmpeg zu streamen, indem Sie ein PNG-Bild laden und auf Schleife sowie das Laden einer MP3-und dann kombinieren sie im Stream zusammen. Das Problem ist, dass ich mindestens eine davon aus der Datei laden muss.

Ich weiß, ich kann mit Movypy Videos erstellen, aber ich kann nicht herausfinden, ob ich das Video von Movypy zu ffmpeg oder direkt zu rtmp streamen kann oder nicht. Ich denke, dass ich viele wirklich kurze Clips erstellen und senden muss, aber ich möchte wissen, ob es eine bestehende Lösung gibt.

Es gibt auch OpenCV, die ich zu rtmp streamen kann, kann aber nicht mit Audio umgehen.

A geschwärzten Version eines ffmpeg Befehl, den ich mit

ffmpeg -loop 1 -framerate 15 -i ScreenRover.png -i "Song-Stereo.mp3" -c:v libx264 -preset fast -pix_fmt yuv420p -threads 0 -f flv rtmp://SITE-SUCH-AS-TWITCH/.../STREAM-KEY 

oder

cat Song-Stereo.mp3 | ffmpeg -loop 1 -framerate 15 -i ScreenRover.png -i - -c:v libx264 -preset fast -pix_fmt yuv420p -threads 0 -f flv rtmp://SITE-SUCH-AS-TWITCH/.../STREAM-KEY 

ich weiß, ist erfolgreich getestet haben, werden diese Befehle nicht richtig für einen reibungslosen Streaming eingerichtet, verwaltet das Ergebnis schrauben beide Player von Twitch und Youtube und ich müssen herausfinden, wie wir das beheben können.

Das Problem dabei ist, ich glaube nicht, dass ich sowohl das Bild als auch das Audio sofort streamen kann, wenn ich sie auf der Stelle erstelle. Ich muss einen von ihnen von der Festplatte laden. Dies wird zu einem Problem, wenn Sie versuchen, auf einen Befehl oder Benutzerchat oder irgendetwas anderes, das Live-Reaktionen erfordert, zu reagieren. Ich will auch nicht meine Festplatte zerstören, indem ich ständig darauf speichere.

Wie ich für den Python-Code bisher versucht habe, um ein Video zu erstellen, ist der folgende Code. Dies spart immer noch in der HD und reagiert nicht in Echtzeit, so dass dies für mich nicht sehr nützlich ist. Das Video selbst ist in Ordnung, mit der einen Ausnahme, dass im Laufe der Zeit die Uhr, die der QR-Code gegenüber der Uhr des Videos sagt, sich immer weiter ausbreitet, je näher das Video dem Ende kommt. Ich kann diese Einschränkung umgehen, wenn sie beim Live-Streaming auftaucht.

def make_frame(t): 
    img = qrcode.make("Hello! The second is %s!" % t) 
    return numpy.array(img.convert("RGB")) 

clip = mpy.VideoClip(make_frame, duration=120) 
clip.write_gif("test.gif",fps=15) 

gifclip = mpy.VideoFileClip("test.gif") 
gifclip.set_duration(120).write_videofile("test.mp4",fps=15) 

Mein Ziel ist es, etwas entlang der psuedo-Code von

original_video = qrcode_generator("I don't know, a clock, pyotp, today's news sources, just anything that can be generated on the fly!") 
original_video.overlay_text(0,0,"This is some sample text, the left two are coordinates, the right three are font, size, and color", Times_New_Roman, 12, Blue) 
original_video.add_audio(sine_wave_generator(0,180,2)) # frequency min-max, seconds 

# NOTICE - I did not add any time measurements to the actual video itself. The whole point is this is a live stream and not a video clip, so the time frame would be now. The 2 seconds list above is for our psuedo sine wave generator to know how long the audio clip should be, not for the actual streaming library. 

stream.send_to_rtmp_server(original_video) # Doesn't matter if ffmpeg or some native library 

Das obige Beispiel zu produzieren ist, was ich für in Python in Bezug auf die Video-Erstellung suchen und dann Streaming. Ich versuche nicht, einen Clip zu erstellen und ihn später zu streamen. Ich versuche, das Programm in der Lage zu sein, auf externe Ereignisse zu reagieren und dann den Stream zu aktualisieren, um zu tun, was immer es will. Es ist ein bisschen wie ein Chat-Bot, aber mit Video statt Text.

def track_movement(...): 
    ... 
    return ... 

original_video = user_submitted_clip(chat.lastVideoMessage) 
original_video.overlay_text(0,0,"The robot watches the user's movements and puts a blue square around it.", Times_New_Roman, 12, Blue) 
original_video.add_audio(sine_wave_generator(0,180,2)) # frequency min-max, seconds 

# It would be awesome if I could also figure out how to perform advance actions such as tracking movements or pulling a face out of a clip and then applying effects to it on the fly. I know OpenCV can track movements and I hear that it can work with streams, but I cannot figure out how that works. Any help would be appreciated! Thanks! 

Weil ich vergessen, die Importe hinzufügen möchten, sind hier einige nützliche Importe ich in meiner Datei haben!

import pyotp 
import qrcode 
from io import BytesIO 
from moviepy import editor as mpy 

Die Bibliothek, pyotp ist ein Pad-Authenticator-Codes für die Erzeugung, qrcode für den QR-Codes ist, BytesIO für virtuelle Dateien verwendet wird, und moviepy ist, was ich verwenden, um die GIF und MP4 zu erzeugen.Ich glaube, dass BytesIO nützlich sein kann, um Daten an den Streaming-Dienst zu leiten, aber wie dies geschieht, hängt vollständig davon ab, wie Daten an den Dienst gesendet werden, ob es über die Befehlszeile (vom Subprozess Import Popen, PIPE) oder über eine native sein soll Bibliothek.

+0

Überprüfen Sie [diese Antwort] (https://stackoverflow.com/a/44128649/7553525) – zwer

Antwort

0

Ich habe mich entschlossen, mit Gstreamer meine Streams on the fly zu erstellen. Es kann mir erlauben, getrennte Video- und Audio-Streams zu nehmen und sie zusammen zu kombinieren. Ich habe gerade kein funktionierendes Beispiel, aber ich werde hoffentlich bald eine Antwort haben oder es selbst herausfinden, unter Gstreamer in Python exits instantly, but is fine on command line.

0

Verwenden Sie ffmpeg.exe und Ausführen eines Befehls über CMD? In diesem Fall können Sie entweder concat demuxer oder pipe verwenden. Wenn Sie concat demuxer verwenden, kann ffmpeg die Bildeingabe aus einer Textdatei übernehmen. Textdatei sollte Bildpfade enthalten und ffmpeg kann diese Bilder aus verschiedenen Ordnern finden. Die folgende Codezeile zeigt, wie Sie concat demuxer verwenden können. Bildstandorte werden in der Datei input.txt gespeichert.

Am geeignetsten wäre jedoch die Verwendung einer Datenleitung, um Bilder an ffmpeg zu senden.

cat *.png | ffmpeg -f image2pipe -i - output.mkv 

können Sie this Link überprüfen Weitere Informationen über ffmpeg Datenpipe zu sehen.

Das Erstellen mehrerer Videos und Streaming in Echtzeit ist keine sehr stabile Lösung. Sie können mehrere Probleme haben.