实验项目四 直播平台
最后一项——一个直播平台。额外功能不提了,核心还是推拉流。
Part1 在Python上用ffmpeg进行推流
参考:CSDN,Python的ffmpy貌似只能指定文件路径的输出,所以想要在Python上用ffmpeg进行推流,只能用subprocess模块启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。关于subprocess也可参见Runoob。
最后是构建了一个pushHelper类,用于满足不同的推送需求。subprocess部分的核心代码见下:
import subprocess as sp process = sp.Popen(command, shell=False, stdout=sp.PIPE, stderr=sp.STDOUT, encoding="utf-8", text=True) # do something
此外这部分也用到了OpenCV这个三方库,主要用它获取摄像头帧,核心代码见下:
camera_path = "" cap = cv.VideoCapture(camera_path) # 获取摄像头帧 fps = int(cap.get(cv.CAP_PROP_FPS))
Part1.1 获取本地视频设备列表
关键:遍历标准输出,正则匹配即可。
cmd = [] # 指令 process = subprocess.Popen(cmd, [opt]) # 运行 for line in process.stdout: # 读取标准输出 #匹配需要的内容
Part2 浏览器拉流
主要是读官方flv.js中的脚本代码理解如何运作的,之后重新写脚本。不过我用的是魔改源代码的方式就是了……
图1 效果如图所示
使用的时候遇到一个问题尚未解决:一个浏览器智能运行一个播放器。
Part3 系统集成
系统集成遇到的最大的问题是一个py文件下只能运行一个程序,比如说运行着Tornado的文件不能推流,推流的进程不能创建PyQt5窗口……吗?
毋庸置疑是可以的,要用到python的多线程技术,具体内容可参考Runoob。
处理线程的启动和中止即可,由于平台实际上很简陋,暂时用不上同步&死锁相关内容。
Part4 结束语
三天做完了,都可以发个B站视频了(bushi
还有很多很简单的功能没做,比如说白板、数据库连接,或者说用户注册、用户中心之类的页面,都没做,不过倒是积累了很多经验。比如这次实验第一次接触的编译文件,第一次接触的多线程功能,当然还有这次实践的主题:直播(也即推拉流)。确实是很有收获的一次课程实践,要不然也不会专门写几篇文字,希望以后也能记录下去,哈哈。
2021年6月23日
15点33分
H40Y

浙公网安备 33010602011771号