首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在流中组合音频和图像

在流中组合音频和图像
EN

Stack Overflow用户
提问于 2017-12-12 21:30:51
回答 2查看 1.9K关注 0票数 1

我希望能够在飞行中创建图像,也可以在飞行中创建音频,并能够将它们组合成rtmp流(用于抽筋或YouTube)。我们的目标是在Python3中实现这一点,因为我的机器人就是用Python3编写的。无需保存到磁盘的额外积分。

到目前为止,我已经知道了如何通过加载PNG图像并在循环中播放它,以及加载mp3,然后将它们组合在流中,使用ffmpeg将它们流式传输到rtmp服务器。问题是我必须从文件中加载至少一个。

我知道我可以使用Moviepy创建视频,但我不知道是否可以将视频从Moviepy流式传输到ffmpeg或直接传输到rtmp。我认为我必须生成许多非常短的剪辑并发送它们,但我想知道是否有现有的解决方案。

还有OpenCV,我听说它可以流到rtmp上,但不能处理音频。

我已经成功测试过的ffmpeg命令的编辑版本是

代码语言:javascript
复制
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

代码语言:javascript
复制
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

我知道这些命令没有正确地设置为流畅流,结果导致Twitch和Youtube的播放器都搞砸了,我必须想办法解决这个问题。

这样做的问题是,当我在现场创建图像和音频时,我不认为我可以同时流式传输它们。我得从硬盘里加载其中一个。当试图对命令或用户聊天或任何其他需要实时反应的内容做出反应时,这就成了一个问题。我也不想因为经常保存硬盘而毁掉我的硬盘。

至于python代码,到目前为止,我已经尝试过以下代码来创建一个视频。这仍然可以节省到房屋署,而且不是实时响应,所以这对我来说不是很有用。视频本身是好的,但有一个例外,随着时间的推移,二维码显示的时钟与视频的时钟开始分开,随着视频越来越接近结尾。如果它在直播时出现,我可以绕过这个限制。

代码语言:javascript
复制
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)

我的目标是能够沿着psuedo-code生成一些东西

代码语言:javascript
复制
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

上面的例子就是我在Python中创建视频,然后进行流媒体播放的例子。我并不是要创建一个剪辑,然后再将其流式传输,我是想让程序能够响应外部事件,然后更新它的流,以做它想做的任何事情。它有点像聊天机器人,但使用的是视频而不是文本。

代码语言:javascript
复制
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!

因为我忘记添加导入,下面是我的文件中的一些有用的导入!

代码语言:javascript
复制
import pyotp
import qrcode
from io import BytesIO
from moviepy import editor as mpy

pyotp库用于生成一次性验证码,qrcode用于二维码,BytesIO用于虚拟文件,moviepy是我用来生成GIF和MP4的库。我相信BytesIO可能有助于将数据输送到流服务,但如何实现,完全取决于数据是如何发送到服务的,它是通过命令行(从子进程import Popen,管道)进行的ffmpeg,还是本地库。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-19 12:14:06

我已经决定使用Gstreamer来动态创建我的流。它可以让我获得单独的视频流和音频流,并将它们组合在一起。我现在还没有一个工作的例子,但我希望很快就能在Gstreamer in Python exits instantly, but is fine on command line上找到答案或自己解决这个问题。

票数 0
EN

Stack Overflow用户

发布于 2017-12-13 00:15:26

您是否正在使用ffmpeg.exe并通过CMD运行命令?如果是这样,您可以使用concat demuxer或pipe。当您使用concat demuxer时,ffmpeg可以从文本文件中获取图像输入。文本文件应该包含图像路径,ffmpeg可以从不同的文件夹中找到这些图像。下面的代码行显示了如何使用concat demuxer。图像位置将保存到input.txt文件中。

代码语言:javascript
复制
ffmpeg -f concat -i input.txt -vsync vfr -pix_fmt yuv420p output.mp4

但最合适的解决方案是使用数据管道将图像提供给ffmpeg。

代码语言:javascript
复制
cat *.png | ffmpeg -f image2pipe -i - output.mkv

您可以查看this链接,以了解有关ffmpeg数据管道的更多信息。

实时生成多个视频和流媒体并不是一个非常稳定的解决方案。你可能会遇到几个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47773888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档