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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、诉求

原因: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):

三、代码

(待补充)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值