如何通过FFMPEG将MATLAB处理后的单帧推流至RTSP?
实现MATLAB处理后单帧的即时RTSP推流
完全可以实现实时推流处理后的单帧画面,下面是两种实用方案,适配你的MATLAB+FFmpeg场景:
方法一:MATLAB + FFmpeg管道推流(低延迟首选)
这种方式通过管道将MATLAB处理后的帧直接传给FFmpeg编码推流,延迟极低,适合实时场景:
启动FFmpeg管道进程
在MATLAB中执行以下代码,初始化FFmpeg的标准输入管道,指定RTSP输出参数:% 替换成你的帧分辨率、帧率和RTSP地址 frameWidth = 1920; frameHeight = 1080; frameRate = 25; rtspUrl = 'rtsp://10.0.0.0:8554/mystream'; ffmpegCmd = sprintf(... 'ffmpeg -f rawvideo -pix_fmt rgb24 -s %dx%d -r %d -i - -c:v libx264 -preset ultrafast -f rtsp %s',... frameWidth, frameHeight, frameRate, rtspUrl); % 启动FFmpeg进程并打开标准输入管道 [ffmpegProcess, ~, ~] = system(ffmpegCmd, '-echo', '-stdin');参数说明:
-f rawvideo表示输入为原始像素数据,-pix_fmt rgb24匹配MATLAB的RGB帧格式,-preset ultrafast最大化编码速度、降低延迟。逐帧处理并推流
处理完每一帧后,将帧数据转换成FFmpeg要求的格式,写入管道:% 假设processedFrame是你处理后的RGB帧(uint8类型,尺寸为HxWx3) % 转成行优先的一维数组,匹配FFmpeg的原始输入格式 frameData = reshape(permute(processedFrame, [2, 1, 3]), 1, []); fwrite(ffmpegProcess, frameData, 'uint8');如果处理的是灰度帧,将
-pix_fmt改为gray,并调整帧数据的维度转换逻辑。结束推流时清理进程
推流完成后,关闭管道并终止FFmpeg进程:fclose(ffmpegProcess); % Windows系统用taskkill,Linux/macOS替换为system('pkill ffmpeg') system('taskkill /f /im ffmpeg.exe');
方法二:MATLAB VideoWriter直接推流(简易实现)
MATLAB R2020b及以上版本支持通过VideoWriter直接写入RTSP流,底层依赖FFmpeg,实现更简洁:
初始化VideoWriter对象
rtspUrl = 'rtsp://10.0.0.0:8554/mystream'; vw = VideoWriter(rtspUrl, 'FFmpeg'); vw.FrameRate = 25; % 设置推流帧率 vw.VideoCompressor = 'libx264'; vw.Quality = 50; % 平衡画质和编码速度,值越低速度越快 open(vw);循环写入处理后的帧
在你的帧处理循环中,直接写入处理完成的画面:while true % 替换成你的帧处理逻辑 processedFrame = yourFrameProcessingFunction(); writeVideo(vw, processedFrame); % 控制帧率,避免推流速度过快 pause(1/vw.FrameRate); end关闭推流
close(vw);
关键注意事项
- 确保FFmpeg已添加到系统环境变量,MATLAB能直接调用
ffmpeg命令。 - 若延迟过高,可尝试降低分辨率、调低画质参数,或添加
-tune zerolatency参数进一步优化FFmpeg编码延迟。 - 测试推流效果时,用VLC播放器打开RTSP地址即可实时查看。
内容的提问来源于stack exchange,提问作者user20623229
相关产品推荐
相关产品推荐

