代码端调用ffmpeg.exe rtsp推流一帧一帧的图片
参考链接
先看这一篇文章【Windows、linux一台电脑rtsp推流另一台拉流显示】,对使用的工具有一个基础认识。
实现
先启动rtsp服务器
c++代码实现
QProcess m_ffmpegProcess;
void startStreaming()
{
QString ffmpegPath, cmdArgs;
//cmdArgs中的参数很重要,图片尺寸要和参数中的一致、等等
cmdArgs = "-f rawvideo -pix_fmt bgr24 -s 640x480 -i - -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://10.26.2.136:8554/video";
ffmpegPath = "D:/ffmpeg/bin/ffmpeg.exe";
m_ffmpegProcess.setProgram(ffmpegPath);
m_ffmpegProcess.setArguments(cmdArgs.split(' '));
// 启动FFmpeg进程
if (!m_ffmpegProcess.startDetached())
{
qDebug() << "Failed to start FFmpeg process: " << m_ffmpegProcess.errorString();
return;
}
if (!m_ffmpegProcess.isOpen()) // 检查是否已打开stdin通道
{
if (!m_ffmpegProcess.open(QIODevice::WriteOnly)) // 打开stdin通道
{
qDebug() << "Failed to open stdin for QProcess: " << m_ffmpegProcess.errorString();
return;
}
}
}
//循环调用streamNextFrame即可实现一帧一帧的图片推到rtsp服务器上
void streamNextFrame(cv::Mat image)
{
QByteArray imageData(reinterpret_cast<const char*>(image.data), image.total() * image.elemSize());
if (!m_ffmpegProcess.isOpen()) // 检查是否已打开stdin通道
{
if (!m_ffmpegProcess.open(QIODevice::WriteOnly)) // 打开stdin通道
{
qDebug() << "Failed to open stdin for QProcess: " << m_ffmpegProcess.errorString();
return;
}
}
m_ffmpegProcess.write(imageData);
}
// 关闭写入端,触发FFmpeg处理数据
m_ffmpegProcess.closeWriteChannel();
// 等待FFmpeg进程结束(可选,取决于您的需求)
m_ffmpegProcess.waitForFinished(-1);
注释
ffmpeg.exe -f rawvideo -pix_fmt bgr24 -s 640x480 -i - -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://10.26.2.136:8554/video
ffmpeg
这是FFmpeg工具的可执行文件名,用于执行各种音视频处理任务。
-f rawvideo
指定输入格式为rawvideo,即未经压缩的原始视频数据。
-pix_fmt bgr24
设置输入视频的像素格式为bgr24。这种格式表示每个像素由连续的3个字节(蓝色、绿色、红色)组成,总共有24位。
-s 640x480
指定输入视频的分辨率,宽度为640像素,高度为480像素。
-i -
这里的-表示从标准输入接收数据。这意味着您需要通过管道或其他方式将原始视频数据重定向到FFmpeg进程的标准输入。
-c:v libx264
指定视频编码器为libx264,即使用H.264编码对输入视频进行压缩。
-preset ultrafast
设置编码预设为ultrafast。预设是一种预定义的编码参数集合,用来控制编码速度和输出质量之间的平衡。ultrafast预设倾向于极快的编码速度,但可能会牺牲一定的压缩效率和输出视频质量。
-tune zerolatency
调整编码器参数以优化零延迟场景。这对于实时流媒体应用非常重要,旨在尽可能减少编码过程中的延迟。
-f rtsp
指定输出格式为rtsp,即Real-Time Streaming Protocol,用于实时音视频流传输。
rtsp://10.26.2.136:8554/video
这是RTSP流的目标地址,包括IP地址(10.26.2.136)、端口号(8554)和流路径(/video)。FFmpeg将把编码后的视频流发送到这个地址。