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

一、诉求

原因: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,自动化,音视频,python)