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

共1条 1/1 1 跳转至

OK3588J-C开发板的HDMI输入转RTMP

工程师
2025-01-26 20:28:09     打赏

这次我们要将HDMI输入也要转成RTMP进行直播。
10501.png

我们需要在上一篇的基础上再增加一个HDMI直播按钮。

头文件


#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();

    void on_pushButton_3_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);
    //connect(ffmpegProcess, &QProcess::readyRead, this, &MainWindow::onReadyReadStandardOutput);
    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()
{
    ffmpegProcess->write("q");
}


void MainWindow::on_pushButton_3_clicked()
{
    if (ui->lineEdit_rtmp->text().length() == 0) {
        ui->label_status->setText("Status: Error - rtmp link is empty");
        return;
    }
    strcpy(rtmp_link, ui->lineEdit_rtmp->text().toStdString().c_str());
    QString program = "ffmpeg";
    QStringList arguments;
    arguments << "-f" << "v4l2" << "-pixel_format" << "nv12" << "-i" << "/dev/video73" << "-vcodec" << "h264_rkmpp" << "-an" << "-f" << "flv" << rtmp_link;
    ffmpegProcess->start(program, arguments);
}

这次依旧是将MainWindow类粘贴上来,其他基本都可以不变

这里需要有一些说明的是,在我们查看HDMI输入支持的pixel format的时候可以看到除了RGB格式,有3个NV格式,
就像YUV可以分为YUV420/YUV422/YUV444一样,其实都是以YUV来进行存储的,但是每个向量所占空间是不同的,NV格式也是一样的

10502.png

接下来我们依然要进行的是编译运行,运行后点击HDMI直播按钮,可以看到状态栏的输出也正常了!

10503.png

我们同样打开VLC来查看一下直播的内容,可以看到直播一切正常,画面也很清晰。





关键词: OK3588J-C     MainWindow     HDMI    

共1条 1/1 1 跳转至

回复

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