如何在Python中使用FFmpeg录制RTSP流的分段10秒音频
实现RTSP音频每10秒分段保存
1. 单段10秒音频录制方法
要仅录制RTSP流的前10秒音频,只需在FFmpeg的输出参数中添加t=10(指定录制时长),代码示例:
import ffmpeg # 录制从连接时刻开始的10秒音频 ffmpeg.input("rtsp://john:<pwd>@192.168.10.111:5545/Streaming/Channels/291/").output( "test_0000.wav", map="0:a:0", t=10 # 核心参数:限制录制时长为10秒 ).run()
执行后FFmpeg会自动录制10秒音频,完成后进程退出,生成目标文件。
2. 循环分段录制(按你的线程调度计划)
如果坚持用“每10秒启动新线程录制10秒”的方案,可通过线程+定时循环实现,同时生成递增文件名避免覆盖:
import ffmpeg import threading import time import os RTSP_URL = "rtsp://john:<pwd>@192.168.10.111:5545/Streaming/Channels/291/" OUTPUT_FOLDER = "./audio_segments" SECOND_PER_CLIP = 10 file_index = 0 # 创建输出目录 os.makedirs(OUTPUT_FOLDER, exist_ok=True) def record_single_clip(): global file_index clip_name = os.path.join(OUTPUT_FOLDER, f"audio_{file_index:04d}.wav") try: ffmpeg.input(RTSP_URL).output( clip_name, map="0:a:0", t=SECOND_PER_CLIP ).run(capture_stdout=True, capture_stderr=True) print(f"已生成片段: {clip_name}") file_index += 1 except Exception as e: print(f"片段录制失败: {str(e)}") if __name__ == "__main__": try: while True: # 启动新线程执行录制任务 thread = threading.Thread(target=record_single_clip) thread.start() # 等待10秒后启动下一段录制 time.sleep(SECOND_PER_CLIP) except KeyboardInterrupt: print("脚本已终止")
注意:这种方式每次重启FFmpeg连接RTSP流,可能导致片段间存在短暂间隙,且频繁连接可能增加摄像头负载。
3. 更优方案:用FFmpeg原生分段功能
推荐使用FFmpeg内置的segment分段模块,单个进程持续处理流,自动每10秒生成新文件,无连接间隙,效率更高:
import ffmpeg RTSP_URL = "rtsp://john:<pwd>@192.168.10.111:5545/Streaming/Channels/291/" OUTPUT_PATTERN = "./audio_segments/audio_%04d.wav" try: ffmpeg.input(RTSP_URL).output( OUTPUT_PATTERN, map="0:a:0", f="segment", # 启用分段输出模式 segment_time=10, # 每段时长10秒 reset_timestamps=1 # 每个分段重置时间戳为0,保证播放正常 ).run() except KeyboardInterrupt: print("录制已停止")
这种方式无需手动管理线程和定时,由FFmpeg内部处理流的分割逻辑,稳定性和流畅度更好。
内容的提问来源于stack exchange,提问作者S Andrew
相关产品推荐
相关产品推荐

