首页 > 编程语言 >Qt/C++音视频开发-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流

Qt/C++音视频开发-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流

时间:2024-11-25 13:32:54浏览次数:7  
标签:SPS 裸流 保存 argv 音视频 PPS include data

Qt/C++音视频开发-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流

介绍

在音视频开发中,保存原始数据流(裸流)时,需要将编解码器的参数集(如H.264/H.265中的SPS和PPS)一同保存。这些参数集包含了解码所需的关键信息。本文将介绍如何在Qt/C++环境下实现这一功能,并支持264/265裸流的转码保存,以及拉流推流。

应用使用场景

  1. 实时流媒体传输:在直播应用中,将编码后的视频流实时推送到服务器。
  2. 视频监控:保存监控摄像头捕获的视频原始数据,以便后续进行分析。
  3. 视频编辑:在视频处理应用中,实现视频格式转换和存储。
  4. 视频点播系统:将编码视频进行分发和存储,以供用户随时点播。

下面是基于 Qt 和 C++ 的示例代码,展示了实时流媒体传输、视频监控数据保存、视频编辑和视频点播系统的基本实现。

实时流媒体传输

#include <QCoreApplication>
#include <QtMultimedia>
#include <QMediaPlayer>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QMediaPlayer player;
    player.setMedia(QUrl("rtsp://your_streaming_url"));
    player.play();

    return a.exec();
}

视频监控数据保存

#include <QCoreApplication>
#include <QCamera>
#include <QCameraInfo>
#include <QMediaRecorder>
#include <QFile>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    if (cameras.isEmpty()) {
        qWarning() << "No available cameras";
        return -1;
    }

    QCamera camera(cameras.first());
    QMediaRecorder recorder(&camera);
    camera.start();

    QFile outputFile("monitoring_output.mp4");
    recorder.setOutputLocation(QUrl::fromLocalFile(outputFile.fileName()));
    recorder.record();

    return a.exec();
}

视频编辑(格式转换和存储)

#include <QCoreApplication>
#include <QProcess>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QProcess ffmpeg;
    QStringList arguments = QStringList()
        << "-i" << "input.mp4" // 输入文件
        << "-c:v" << "libx264" // 编码器
        << "-preset" << "fast"
        << "-crf" << "22"
        << "output.mp4"; // 输出文件

    ffmpeg.start("ffmpeg", arguments);
    ffmpeg.waitForFinished(-1);

    return a.exec();
}

视频点播系统

#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <QFile>

class VideoServer : public QTcpServer
{
    Q_OBJECT

public:
    explicit VideoServer(QObject *parent = nullptr) : QTcpServer(parent) { }

protected:
    void incomingConnection(qintptr socketDescriptor) override
    {
        QTcpSocket *socket = new QTcpSocket(this);
        socket->setSocketDescriptor(socketDescriptor);

        QFile videoFile("video_on_demand.mp4");
        if (videoFile.open(QIODevice::ReadOnly)) {
            while (!videoFile.atEnd()) {
                QByteArray data = videoFile.read(1024); // 每次读取 1KB 数据
                socket->write(data);
                socket->waitForBytesWritten();
            }
            videoFile.close();
        }

        socket->disconnectFromHost();
        socket->deleteLater();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    VideoServer server;
    if (!server.listen(QHostAddress::Any, 12345)) {
        qCritical() << "Server could not start!";
        return -1;
    }

    return a.exec();
}

以上示例分别展示了如何使用 Qt 和 C++ 实现实时流媒体传输、视频监控数据保存、视频格式转换和视频点播系统的基本功能

原理解释

SPS/PPS信息

SPS (Sequence Parameter Set) 和 PPS (Picture Parameter Set) 是H.264/H.265标准中的重要组成部分,它们包含了视频流的解码信息,如图像尺寸、帧率等。解析和保存这些信息是正确解码视频流的前提。

算法原理流程图

读取裸流 是否包含SPS/PPS? 解析SPS/PPS 读取下一帧 保存SPS/PPS到文件 保存视频裸流 合成完整视频文件

算法原理解释

  1. 读取裸流:从输入源(如文件或网络流)中读取原始视频裸流。
  2. 检查SPS/PPS:判断当前数据是否包含SPS/PPS信息。
  3. 解析并保存SPS/PPS:若包含SPS/PPS,则解析并保存这些参数集。
  4. 保存裸流:将视频裸流数据保存到文件中。
  5. 合成完整视频文件:将保存的SPS/PPS和裸流数据合成为一个完整的视频文件。

实际应用代码示例实现

#include <QFile>
#include <QDebug>
#include <QByteArray>

// 假设我们有一个读取裸流数据的函数
bool readRawStreamData(QFile &file, QByteArray &data);

void saveWithSPSPPS(const QString &inputFile, const QString &outputFile) {
    QFile input(inputFile);
    if (!input.open(QIODevice::ReadOnly)) {
        qWarning() << "Failed to open input file";
        return;
    }

    QFile output(outputFile);
    if (!output.open(QIODevice::WriteOnly)) {
        qWarning() << "Failed to open output file";
        return;
    }

    QByteArray data;
    bool spsppsSaved = false;

    while (readRawStreamData(input, data)) {
        // 假设我们有一个解析SPS/PPS的函数
        if (isSPSPPS(data) && !spsppsSaved) {
            output.write(data);
            spsppsSaved = true;
        } else {
            output.write(data);
        }
    }

    input.close();
    output.close();
}

bool isSPSPPS(const QByteArray &data) {
    // 简单检查是否为SPS/PPS数据,例如通过NALU类型判断
    return data.size() > 4 && (data[4] & 0x1F) == 7; // 7表示SPS
}

// 示例:读取裸流数据
bool readRawStreamData(QFile &file, QByteArray &data) {
    // 简单示例,每次读取固定大小的数据块
    const int chunkSize = 1024;
    data = file.read(chunkSize);
    return !data.isEmpty();
}

测试代码

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    if (argc != 3) {
        qWarning() << "Usage: program <input_file> <output_file>";
        return 1;
    }

    QString inputFile = argv[1];
    QString outputFile = argv[2];

    saveWithSPSPPS(inputFile, outputFile);

    return 0;
}

部署场景

  1. 开发环境

    • 安装Qt SDK。
    • 配置C++编译环境。
  2. 生产环境

    • 确保所有依赖库已安装。
    • 编译并部署可执行文件到目标服务器或设备。

材料链接

总结

通过在Qt/C++环境下实现保存裸流以及SPS/PPS信息,可以有效地解决视频流的存储和传输问题。本文介绍了相关的原理、算法以及实际的代码实现,为相关应用提供了参考。

未来展望

随着视频技术的发展,新的编码标准(如AV1)和更高效的压缩算法将不断涌现。未来的工作可以包括:

  1. 支持更多编码标准:如AV1、VP9等。
  2. 优化性能:提高数据处理的效率,适应高分辨率视频的需求。
  3. 集成AI技术:实现智能化的视频处理和分析。

标签:SPS,裸流,保存,argv,音视频,PPS,include,data
From: https://blog.csdn.net/feng1790291543/article/details/142202031

相关文章

  • python本地保存浏览器文件夹
    BIGSMATER/local-bookmark其实就是找到本地文件,json解析然后dfs,文件名上有点坑,暴力替换即可importjsonimportosfromseleniumimportwebdriver#refs:#https://blog.csdn.net/Demonslzh/article/details/125062240#https://www.cnblogs.com/superhin/p/12600358.html......
  • android 拍照图片保存方法之二
    直接利用(Bitmap)extras.get("data")方法获得的图片是系统自动压缩过的缩略图,清晰图不够。这次介绍的方法是通过uri传递来保存图片。大概思路如下:在程序内部创建一个临时文件,利用临时文件的uri传递给响应事件获得原图,并且在一个imageview中显示出来,如果喜欢的话就重新命名......
  • 如何快速下载Suno AI平台上的音乐歌曲?保存为MP3格式
            如果你在最近火出圈的SunoAI平台上听到比较喜欢的歌曲,并想要下载到自己的手机电脑上,遗憾的是,SunoAI平台本身并不直接提供下载歌曲MP3的方法。SunoAI怎么下载其他人的音乐到本地?SunoAI获取歌曲直链,充实你的mp3?SunoAI上的歌很好听,我想下载到手机上,怎么下......
  • 【Linux】:进程信号(再谈信号保存和信号捕捉)
    ✨                         不懂就问,问了不懂,你懂问他    ......
  • 学会这些 API,轻松开发 UniApp 音视频功能
    UniApp音频与视频处理详解UniApp提供了一系列强大的API,用于音频与视频的录制、播放和管理。这些API能够帮助开发者快速实现多媒体功能,适用于聊天工具、音乐播放器、短视频应用等场景。本文详细介绍音频与视频相关API的作用、参数及示例代码。一、音频处理1.录音功能(Re......
  • 基于中药材顺序表状态保存的操作撤回栈的实现
    叠甲:本文题解仅代表个人见解,非官方答案,大家有更好想法可以分享出来参考,大家如果有啥意见或者纠错都可以向我反映,我会及时查看意见并进行修改。解题环境:VS2022语言:C++        思路:撤回对中药材的操作,也可以是撤回中药材的状态......
  • Cookie 是什么?从保存登录到广告追踪的那些事
    你有没有想过,为什么购物网站能记住你没结算的商品,视频网站会推荐你喜欢的内容?这一切的“幕后功臣”就是浏览器中的Cookie。它是一个看不见的小帮手,但很多时候,它也可能成为广告商和数据收集者的工具。今天,我们就来聊聊Cookie的前世今生、工作原理,以及如何保护自己的隐私。Cooki......
  • Vue3 - 详细实现移动端H5网页调用摄像头拍照功能,微信公众号网页h5页面打开本地摄像头
    前言PC网站端,请访问这篇文章。在vue3手机移动端开发中,详解H5页面/微信公众号网页调用浏览器摄像头并拍照完整示例,在手机浏览器上开启摄像头并拍照上传服务器或保存到本地功能(实时预览使用图片临时路径或base64数据),切换转换前置摄像头与后置摄像头,vue3手机H5打开摄像......
  • 论文精读:多源域自适应目标检测中的目标相关知识保存(CVPR2022)
    原文标题:Target-RelevantKnowledgePreservationforMulti-SourceDomainAdaptiveObjectDetection中文标题:多源域自适应目标检测中的目标相关知识保存论文地址:https://arxiv.org/pdf/2204.07964代码地址:无官方实现?我有点纳闷难道顶会不公布代码的吗这篇文章是由北......
  • Gstreamer系列(5):Gstreamer在arm平台(Nano, Orin, Xavier等)使用硬编码对视频进行保存mp
            在工程实践中,通常使用使用英伟达版板卡作为图像处理的控制器,常见的有xavier,TX2,orin,Nano等,这些控制器使用Gstreamer进行硬件编码的插件通常为omxh264enc,nvv4l2h264enc。本文将基于这两个插件进行介绍区别,并给出使用示例本。本系列其他文章有:Gstreamer系......