【python】自动化ffmpeg推rtmp流 + 进程停止

该博客介绍了如何利用ffmpeg命令在Python环境中实现rtmp推流的自动化,包括在两个rtmp地址间轮询推流并保持视频连贯,以及结合屏幕录制和切片处理实现视频实时分析。同时,文中详细阐述了多线程控制推流逻辑,如每隔5秒切换推流目标,并展示了如何通过进程管理控制ffmpeg推流的启动和停止。此外,还提供了在Mac和Windows系统中查看和杀死ffmpeg进程的命令。
摘要由CSDN通过智能技术生成

一、诉求

原因:ffmpeg命令可实现自动化推流,一般在执行之后,由于python的自上而下执行,后续代码逻辑无法执行

场景1:
需要给两个rtmp地址轮询推流,但希望视频链接续上,即指定视频文件的推流时间戳。
(AWS上同一个通道,HA支持两个rtmp、同一个m3u8)

场景2:
ffmpeg实现屏幕录制,存储成视频文件;
同时执行切片,且同时对图片进行处理,达到实时分析视频的目的。

二、实现

ffmpeg推流命令

ffmpeg -re -ss 35 -stream_loop -1 -re -i A_output.mp4 -vcodec libx264 -acodec aac -f flv rtmp://ip:port/name/

ffmpeg播放命令

ffplay https://url/index.m3u8

实现逻辑:通过循环数字,进行逻辑控制

定义全局时钟:每5s切换一次rtmp

启动两个线程
执行推流1命令
执行推流2命令


写循环:是我要验证的次数
    循环内:
    0s:
    同时启动线程1、线程2

    5s:
    线程1超时,走线程2

    10s:
    线程2超时,启动新的一个线程,rtmp1 从指定位置开始推流-ss 10,从第10s开始推
    走线程1

    15s:
    启动新的一个线程,rtmp2 从指定位置开始推流-ss 15,从第15s开始推
    同时推线程1、线程2

    20s:
    线程1超时,走线程2

    25s:
    线程2超时,启动新的一个线程,rtmp1 从指定位置开始推流-ss 25,从第25s开始推
    走线程1

    30s:
    启动一个新的线程,rtmp2 从指定位置开始推流-ss 30,从第30s开始推
    同时推线程1、线程2

mac查看进程命令 + 杀死进程命令

ps -ef | grep ffmpeg
kill -9 pid

windows查看进程方式 + 杀死进程命令

创建进程时可获取Process.pid
taskkill /f /t /pid 12344
taskkill /f /im ffmpeg.exe
taskkill /f /im python.exe

给一个标识,确认ffmpeg推流进程状态,当达到条件后,杀死进程停止推流

class Job(threading.Thread):

    def __init__(self,ss_num,url,between_time,*args, **kwargs):
        super(Job, self).__init__(*args, **kwargs)
        self.__running = threading.Event()  # 用于停止线程的标识
        self.__running.set()  # 将running设置为True

    def run(self):
        while True:
            # 添加验证嵌入时间戳命令
            ffmpeg_cmd_rtmp = "ffmpeg -re -ss " + str(self.ss_num) + " -stream_loop -1 -i A_output.mp4 -c:v h264_qsv -pic_timing_sei 1 -acodec aac -f flv rtmp://" + self.url
           
            if self.__running.isSet():

控制开启子进程方法

# 控制子进程
class Coo():
    def __init__(self):
        self.tmp_thread = None
    # 开启子进程
    def execute(self,ss_num,url,between_time):
        t = Job(ss_num,url,between_time)
        t.setDaemon(True)
        t.start()
        self.tmp_thread = t
        t.join()
        
class CustErr(Exception):
    pass

def main(ss_num,url,between_time):
    a = Coo()
    a.execute(ss_num, url, between_time)

main中包含推流时刻 + 杀死进程逻辑

if __name__ == '__main__':
    from multiprocessing import Process
    between_time = 10
    num = 601
    for i in range(num):

三、代码

(待补充)

要在 Python 中使用 ffmpeg 进行本地 RTMP ,你可以使用 subprocess 模块来调用 ffmpeg 命令。以下是一个简单的示例代码: ```python import subprocess # ffmpeg 命令 ffmpeg_cmd = 'ffmpeg -f avfoundation -i "default" -c:v libx264 -preset ultrafast -tune zerolatency -f flv rtmp://localhost:1935/live/stream' # 启动 ffmpeg 进程 ffmpeg_process = subprocess.Popen(ffmpeg_cmd, shell=True) # 等待一段时间 # 这里只是为了让 ffmpeg 进程有时间进行,实际使用时可以根据需要调整等待时间 time.sleep(10) # 停止 ffmpeg 进程 ffmpeg_process.terminate() ``` 在上面的示例代码中,我们使用 subprocess 模块启动了一个 ffmpeg 进程,并向它传递了一个 ffmpeg 命令。这个命令会从默认音视频设备(Mac 上是 avfoundation)获取输入,并将其编码为 H.264 视频和 AAC 音频格式,然后将结果到本地的 RTMP 服务器(地址为 rtmp://localhost:1935/live/stream)。我们还在代码中加入了一个等待时间,以确保 ffmpeg 进程有足够的时间来进行。最后,我们使用 terminate() 方法停止ffmpeg 进程。 需要注意的是,在上面的示例代码中,我们使用了 shell=True 参数来启用 shell 命令解释器。这样做可能会导致一些安全问题,因此在实际使用中,你可能需要使用更安全的方式来调用 ffmpeg 命令,例如使用 subprocess.call() 方法或者使用 ffmpeg-python 等第三方库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值