代码端调用ffmpeg.exe rtsp推流一帧一帧的图片

代码端调用ffmpeg.exe rtsp推流一帧一帧的图片

参考链接

先看这一篇文章【Windows、linux一台电脑rtsp推流另一台拉流显示】,对使用的工具有一个基础认识。

实现

先启动rtsp服务器

1

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将把编码后的视频流发送到这个地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值