在上一篇报告中,我们已经将QT环境搭配好,并简单测试了一下DEMO的编译和运行。接下来我们写QT程序,将RTSP链接进行直播,但是与以前的不同是,我们并不进行API编程,而是通过采用命令式调用的方案来进行编程。
首先,我们简单的绘制一下前端的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::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ffmpegProcess = new QProcess(this);
ffmpegProcess->setProcessChannelMode(QProcess::MergedChannels);
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");
}
在QT中运行外部命令是需要用到QProcess组件进行,然后使用QStringList来配置命令的具体参数,最后使用start方法进行调用。
在运行时,如果需要输入命令进行交互,那么可以使用write方法将内容传入进去。
对于QProcess命令的输出,如果内容不多或者可以一次性将运行结果输出的,比如ls命令等,可以直接进行读取,不过对于咱们的ffmpeg命令时一边运行,一边进行输出的,那么就需要使用槽函数进行connect来进行。
然后我们试着运行一下,然后把RTSP链接和RTMP链接输入进行,然后点击直播按钮,就可以看到下面的状态栏已经开始成功输出了。
我们通过设置好的RTMP链接,在VLC中打开进行查看,可以看到已经成功开始直播了,而且画面非常清晰,显示正常!