如何用FFmpeg实现RTSP流按需转码:非H264转码,H264直接复制
FFmpeg 适配RTSP转HLS的动态编码命令方案
针对100路RTSP转HLS的需求,兼顾H264流直接复制、非H264流(如HEVC)转码的FFmpeg命令及无Shell环境适配方案如下:
核心命令
ffmpeg -i rtsp://摄像头RTSP地址 -c:v copy -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -f hls -hls_time 2 -hls_list_size 10 -hls_flags delete_segments 输出路径/playlist.m3u8
参数说明
-i rtsp://摄像头RTSP地址:指定输入RTSP流地址-c:v copy:优先直接复制视频帧,仅当输入为H264编码时生效;非H264编码时自动 fallback 到下一个编码参数-c:v libx264 -crf 23 -preset medium:输入为非H264编码时,调用libx264转码为H264。crf 23为默认画质基准值,preset medium平衡编码速度与文件体积-c:a aac -b:a 128k:统一将音频转码为HLS兼容的AAC格式,码率128k-f hls -hls_time 2 -hls_list_size 10 -hls_flags delete_segments:输出HLS格式,切片时长2秒,保留最近10个切片,自动删除旧切片以控制磁盘占用
无Shell环境适配(Python/Node.js)
在无Shell模式下,需将命令拆分为参数数组,避免Shell解析问题:
Python 示例
import subprocess # 替换为实际摄像头地址和输出路径 camera_rtsp = "rtsp://your-camera-url" output_hls = "/path/to/output/playlist.m3u8" cmd = [ "ffmpeg", "-i", camera_rtsp, "-c:v", "copy", "-c:v", "libx264", "-crf", "23", "-preset", "medium", "-c:a", "aac", "-b:a", "128k", "-f", "hls", "-hls_time", "2", "-hls_list_size", "10", "-hls_flags", "delete_segments", output_hls ] subprocess.run(cmd, check=True, capture_output=True)
Node.js 示例
const { spawn } = require("child_process"); // 替换为实际摄像头地址和输出路径 const cameraRtsp = "rtsp://your-camera-url"; const outputHls = "/path/to/output/playlist.m3u8"; const ffmpegProcess = spawn("ffmpeg", [ "-i", cameraRtsp, "-c:v", "copy", "-c:v", "libx264", "-crf", "23", "-preset", "medium", "-c:a", "aac", "-b:a", "128k", "-f", "hls", "-hls_time", "2", "-hls_list_size", "10", "-hls_flags", "delete_segments", outputHls ]); // 可选:捕获日志输出 ffmpegProcess.stderr.on("data", (data) => { console.error(`FFmpeg日志: ${data.toString()}`); }); ffmpegProcess.on("close", (code) => { console.log(`FFmpeg进程退出,码值: ${code}`); });
批量处理注意事项
- 100路流需单独启动FFmpeg进程,避免单进程负载过高导致卡顿
- 可根据服务器CPU性能调整
preset参数:fast编码速度更快,slow画质更优但编码耗时更长 - 若部分摄像头无音频,可添加
-an参数禁用音频输出
内容的提问来源于stack exchange,提问作者Logically Invalid
相关产品推荐
相关产品推荐

