在流中组合音频和图像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在流中组合音频和图像相关的知识,希望对你有一定的参考价值。

我希望能够动态创建图像,并且还可以动态创建音频,并且能够将它们组合成rtmp流(用于Twitch或YouTube)。目标是在Python 3中实现这一点,因为这是我的机器人编写的语言。无需保存到磁盘的奖励点。

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

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

还有OpenCV,我听说可以流式传输到rtmp,但无法处理音频。

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

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

要么

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代码,到目前为止我为了创建视频而尝试的是以下代码。这仍然保存到高清,并且没有实时响应,所以这对我来说不是很有用。视频本身是可以的,但有一个例外,随着时间的推移,当视频越来越接近时,qr代码所说的时钟与视频的时钟开始分散得越来越远。如果它在直播期间出现,我可以解决这个限制。

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生成一些东西

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中进行视频创建然后进行流式处理时所寻找的。我不是想创建一个剪辑然后再流式传输,我试图让程序能够响应外部事件,然后更新它的流来做任何想做的事情。它有点像聊天机器人,但有视频而不是文字。

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!

因为我忘了添加导入,这里有一些我文件中有用的导入!

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

库pyotp用于生成一次填充验证码,qrcode用于qr码,BytesIO用于虚拟文件,moviepy是我用来生成GIF和MP4的。我相信BytesIO对于将数据传输到流服务可能很有用,但是如何发生这种情况,完全取决于数据如何发送到服务,无论是通过命令行ffmpeg(来自子进程导入Popen,PIPE)还是原生数据图书馆。

答案

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

ffmpeg -f concat -i input.txt -vsync vfr -pix_fmt yuv420p output.mp4

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

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

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

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

另一答案

我已经决定使用Gstreamer来动态创建我的流。它可以让我拍摄单独的视频和音频流并将它们组合在一起。我现在还没有确切的工作实例,但我希望能够很快找到答案,或者很快就会在Gstreamer in Python exits instantly, but is fine on command line找到答案。

以上是关于在流中组合音频和图像的主要内容,如果未能解决你的问题,请参考以下文章

音频流中的歌曲标题编码

防止在流中输入不需要的值

如何在流中使用来自另一个流数据的数据? (科特林流程)

使用 firebase auth 和 firestore 在流中调用未来

你啥时候在流中使用接口而不是类型别名?

C# 在流中添加 40 个字节