
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自Mplay项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。
解决方法
首先我们得先查询后台是否有ffmpeg进程
bash
ps -aux
根据pid定位到所运行的ffmpeg进程,如果ffmpeg不结束,那么就会一直生成音视频文件。
找到包括指定rstp视频流的ffmpeg进程。
python
rint("出问题的id为======================================",device_id)
rtsp_url = device_info['rtsp']
rtsp_lower = rtsp_url.lower()
for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
try:
proc_name = proc.name().lower()
proc_cmd = ' '.join(proc.cmdline()).lower() if proc.cmdline() else ''
is_ffmpeg_proc = 'ffmpeg' in proc_name or 'ffmpeg' in proc_cmd
if not is_ffmpeg_proc:
continue # 不是FFmpeg进程,直接跳过
# 3.2 再判断是否包含当前设备的RTSP地址(确保是该设备对应的进程)
if rtsp_lower in proc_cmd:
logger.info(f"找到设备 {device_id} 对应的FFmpeg进程(PID: {proc.pid}),开始终止")
# 尝试正常终止,3秒超时后强制终止
proc.terminate()
# try:
# proc.wait(timeout=3)
# logger.info(f"FFmpeg进程(PID: {proc.pid})已正常终止")
# except psutil.TimeoutExpired:
proc.kill()