用gstreamer实现推流视频的硬件加速视频压缩和转码 | 方案迭代&集成到后端的部分代码截图(暂定)&测试出现问题和解决

4 篇文章 0 订阅
3 篇文章 0 订阅

实现目标

安全堡垒机项目,欲将gstreamer硬件加速视频压缩转码功能集成到厂站后端。

操作过程截图记录

删除以下部分:

第一个方案:

第二个方案:

增加以下部分:

转码命令如下:

subprocess.run("gst-launch-1.0 -e filesrc location={target} ! flvdemux name=demux demux.video ! vpudec ! vpuenc_h264 quant=30 gop-size=2000 ! queue ! h264parse  !  mp4mux ! filesink location={comp} ".format(target=filefullpath, comp=self.sync_path + file.replace(".flv",".mp4")), shell=True)

os.remove(filefullpath)  #删除之前的那个flv文件
第三个方案:

换了几次压缩视频+转码的方案

→调用线程class类→通过stats定时检查→放到obsrecord推流结束后执行压缩视频的线程

写到定时检查的stat.py文件位置中去

webapp.py里只在这里用到了stats

然后在定时任务stats.py中检查有没有压缩任务

把过程写到def里面

定时检查这个方法不会调用函数,所以换一种执行方式:在推流结束后执行压缩线程

(因为都是关于视频流的操作,写到一起比较合适)

推流结束更新完数据库之后执行压缩视频的线程

之后把前面几个方案的代码删掉 然后在服务器贴上改动的代码进行测试

测试过程的问题和解决

测试集成到厂站项目的硬件加速压缩视频功能

刚开始推流失败,检查后,需要将后端服务、nginx服务全部重启才能正常推流

首先在添加硬件压缩代码之前的推流行为:可以正常运行,生成flv文件

在推流相关文件obsrecord.py相应位置添加硬件压缩的语句后:

有部分录像,但是没有成功转换格式

没有办法正常结束推流,出现报错:

录屏遇到了—些问题:

Last message repeated 539 times

WriteN, RTMP send error 10054 (129 bytes)WriteN, RTMP send error 10054 (46 bytes)WriteN, RTMP send error 10038 (42 bytes)av_interleaved_write_frame(: Operation notpermitted

frame= 21 fps=5.9 q=13.0 size= 1260kBtime=00:00:04.00 bitrate=2580.8kbits/s dup=odrop=85 speed=1.13x

[flv @ 08dd1a40] Failed to update header withcorrect duration.

[flv @ 08dd1a40] Failed to update header withcorrect filesize.

Error writing trailer of rtmp://10.200.255.38/live/ICL1OCQH7J-: Operation not permittedframe=21 fps=1.0 q=13.0 Lsize= 1260kB

time=00:00:04.00 bitrate=2580.8kbits/s dup=odrop=85 speed=0.186x

video:1260kB audio:0kB subtitle:0kB other

streams:0kB global headers:0kB muxing overhead:0.073267%

[libx264 @ 08dd2e60] frame l:2Avg QP:12.60size:340119

这份报错信息显示了在录屏推流时出现了一些问题。具体原因有可能是网络连接不稳定,也有可能是推流卡顿或者推流码率过高等等。

首先,针对 RTMP send error 错误,建议先检查网络状态,确认网络连接是否正常。网络不稳定或网络延迟过高可能导致 RTMP 协议传输错误,从而导致推流失败。

其次,关于 Failed to update header with correct duration 和 Failed to update header with correct filesize 错误,可能是因为录屏推流过程中出现了断流或者因为其它原因导致推流停止了,但是程序并没有正确地关闭推流任务,导致推流后续进程不能正确运行。针对这种情况,可以尝试重新启动推流任务或者重新编写推流代码以确保程序能够正确地关闭推流进程。

最后,针对 Operation not permitted 错误,这种情况可能是由于程序没有足够的权限来操作设备或者文件系统,或者是由于设备被其他进程占用导致的。如果是前者,可以尝试在程序运行时提高权限级别;如果是后者,可以尝试关闭占用该设备的进程。

把硬件压缩注释掉后还是有问题 尝试检查cpu占用率:尝试后不是因为这个原因

依次将后端54321端口重启、nginx服务1935重启 再推流就有数据了

关于测试的结果没有达到预期效果的原因:obsrecord.py~文件是备份文件,不会动

要将自己修改的obsrecord.py文件拖动到255.38中去执行 系统会首先执行.py文件,让它自动生成对应的.pyc文件

执行压缩转码过程出现报错:

这个错误通常是因为使用了 subprocess 模块的 run 函数而不是 Popen 函数,导致 AttributeError: 'CompletedProcess' object has no attribute 'wait' 的问题。具体来说,run 函数会自动等待子进程结束并返回 CompletedProcess 对象,而该对象没有 wait() 方法。而 Popen 函数则返回 Popen 对象,该对象可以调用 wait() 方法等待子进程执行完毕。

更换为popen:

可以执行,但不停的压缩

视频文件无法播放,且上面p.wait()没有执行成功,可能是因为p这条压缩指令一直都在执行,没有结束 要想办法让它结束

将列表中压缩转码的文件逆序排列:在排序的位置加上-号

可以播放 但是转换的文件不是我想要的文件,要想办法让刚才推流结束的文件进行转码

进行修改:

推流过程的压缩转码截图:

转码结束后,压缩成功,原始文件被删除,转码压缩后的视频可以播放,比较清晰

问题:如果直接ctrl+c也会表示转码成功 但是只有1s的时间 原始文件却已经被删除了 还需要添加关机等异常处理机制

压缩过程中打断,还是会显示压缩成功结束:因为ret=p.wait()成功返回为0,表示子进程结束了,即使是打断结束了压缩过程

原因:对于 try-except-else 结构,如果没有发生任何异常,子进程会在 try 语句块结束后被隐式关闭。因此,在代码中进行显式的等待子进程结束操作是不必要的,可以将 wait 方法移除

(不需要这个异常处理 因为用户不会跑到我们后台来打断这个过程)

最后的提交方案:

在调用推流相关的线程时启动压缩转码的线程独自跑,保持循环

去掉多余的提示信息,该info的i 该error的e

问题:将视频文件路径下的文件进行压缩转码为MP4文件后,数据库中还找不到,所以要对数据库中的表项也改后缀名

视频转码+压缩成功后,更新数据库obs_record表对应视频的后缀名为.mp4,便于前端搜得到转码后的内容

已经把文件都转完后,这个运行查询是否损坏的指令还是比较占空间,所以可以想办法让查询判断的时候先把flv文件的视频内容过滤出来

更正后:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值