这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » OK3588J-C开发板的RTSP转RTMP直播

共1条 1/1 1 跳转至

OK3588J-C开发板的RTSP转RTMP直播

工程师
2025-01-26 20:30:17     打赏

接下来我们写QT程序,将RTSP链接进行直播,但是与以前的不同是,我们并不进行API编程,而是通过采用命令式调用的方案来进行编程。
10401.png

首先,我们简单的绘制一下前端的UI,主要是需要的是输入RTSP链接的框、RTMP链接的框,还需要一个开始按钮、结束按钮和状态栏。

其他代码可以不改变,需要改变的只有MainWindow的类,具体代码如下:

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProcess>
#include <stdlib.h>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();
    
    void onReadyReadStandardOutput();
    
    void onReadyReadStandardError();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
    QProcess *ffmpegProcess;
    char rtsp_link[255], rtmp_link[255];
};
#endif // MAINWINDOW_H

源文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ffmpegProcess = new QProcess(this);
    ffmpegProcess->setProcessChannelMode(QProcess::MergedChannels);
    // 接收QProcess运行的命令输出的内容
    connect(ffmpegProcess, &QProcess::readyReadStandardOutput, this, &MainWindow::onReadyReadStandardOutput);
    connect(ffmpegProcess, &QProcess::readyReadStandardError, this, &MainWindow::onReadyReadStandardError);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onReadyReadStandardOutput()
{
    QByteArray output = ffmpegProcess->readAllStandardOutput();
    // 读取具体的输出信息,并显示到状态栏上
    ui->label_status->setText(QString("Status: Output - ") + QString(output));
}

void MainWindow::onReadyReadStandardError()
{
    QByteArray error = ffmpegProcess->readAllStandardError();
    ui->label_status->setText(QString("Status: Error - ") + QString(error));
}

void MainWindow::on_pushButton_clicked()
{
    if (ui->lineEdit_rtsp->text().length() == 0) {
        ui->label_status->setText("Status: Error - rtsp link is empty");
        return;
    }
    if (ui->lineEdit_rtmp->text().length() == 0) {
        ui->label_status->setText("Status: Error - rtmp link is empty");
        return;
    }
    strcpy(rtsp_link, ui->lineEdit_rtsp->text().toStdString().c_str());
    strcpy(rtmp_link, ui->lineEdit_rtmp->text().toStdString().c_str());
    QString program = "ffmpeg";
    QStringList arguments;
    // 配置命令的具体参数
    arguments << "-i" << rtsp_link << "-vcodec" << "h264_rkmpp" << "-an" << "-f" << "flv" << rtmp_link;
    // 启动命令
    ffmpegProcess->start(program, arguments);
}


void MainWindow::on_pushButton_2_clicked()
{
    // 退出ffmpeg是需要输入q
    ffmpegProcess->write("q");
}

在QT中运行外部命令是需要用到QProcess组件进行,然后使用QStringList来配置命令的具体参数,最后使用start方法进行调用。
在运行时,如果需要输入命令进行交互,那么可以使用write方法将内容传入进去。
对于QProcess命令的输出,如果内容不多或者可以一次性将运行结果输出的,比如ls命令等,可以直接进行读取,不过对于咱们的ffmpeg命令时一边运行,一边进行输出的,那么就需要使用槽函数进行connect来进行。

10402.png

然后我们试着运行一下,然后把RTSP链接和RTMP链接输入进行,然后点击直播按钮,就可以看到下面的状态栏已经开始成功输出了。
10403.png

我们通过设置好的RTMP链接,在VLC中打开进行查看,可以看到已经成功开始直播了,而且画面非常清晰,显示正常!





关键词: OK3588J-C     MainWindow     RTSP    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]