libvlc視頻播放器: 播放rtsp/rtmp視頻流

      網友投稿 1342 2025-03-31

      一、功能介紹


      libvlc播發器引擎除了能播放本地視頻外,也支持播放各種協議的流媒體視頻,比如常見的RTMP、RTSP格式視頻。

      在前面幾篇文章里陸陸續續介紹了libvlc的常用的使用方法,這篇文章繼續介紹libvlc的知識點: 播放指定協議的視頻。

      libvlc提供了兩種直接打開視頻的方法:

      libvlc視頻播放器: 播放rtsp/rtmp視頻流

      /** * Create a media with a certain given media resource location, * for instance a valid URL. * * \note To refer to a local file with this function, * the file://... URI syntax must be used (see IETF RFC3986). * We recommend using libvlc_media_new_path() instead when dealing with * local files. * * \see libvlc_media_release * * \param p_instance the instance * \param psz_mrl the media location * \return the newly created media or NULL on error */ LIBVLC_API libvlc_media_t *libvlc_media_new_location( libvlc_instance_t *p_instance, const char * psz_mrl ); /** * Create a media for a certain file path. * * \see libvlc_media_release * * \param p_instance the instance * \param path local filesystem path * \return the newly created media or NULL on error */ LIBVLC_API libvlc_media_t *libvlc_media_new_path( libvlc_instance_t *p_instance, const char *path );

      其中 libvlc_media_new_path 用于打開本地視頻文件,可以直接傳入本地磁盤路徑。

      例如:

      libvlc_media_new_path(vlc_base,"D:\\work\\test.mp4");

      注意: windows下使用libvlc_media_new_path 函數傳入的路徑要注意斜杠問題,必須保證傳入的是雙右斜杠,如果默認選擇的路徑是左斜杠,可以使用std::replace函數轉換一下。

      filename="D:/work/test.mp4"; std::replace(filename.begin(), filename.end(), QChar('/'), QChar('\\'));

      另一個libvlc_media_new_location 函數用于打開協議,這個函數更加強大,可以支持很多協議,本地視頻也可以使用該函數打開,更加通用一點,而且使用該函數時,路徑斜杠使用常規左斜杠就行(linux風格),不需要進行轉換。

      下面介紹幾個常用的使用示例:

      打開本地文件: libvlc_media_new_location (inst, "file:///D:/work/test.mp4"); 打開RTSP流媒體:libvlc_media_new_location (inst, "rtsp://10.0.0.4:554/cam"); 打開RTMP流媒體:libvlc_media_new_location (inst, "rtmp://10.0.0.4:554/cam"); 播放當前桌面屏幕: libvlc_media_new_location (inst, "screen://");

      注意: 使用 libvlc_media_new_location 函數打開路徑之后不要使用std::replace轉換路徑。

      播放桌面屏幕的效果:

      libvlc_media_new_location (inst, "screen://")

      播放rtmp流效果

      libvlc_media_new_location (inst, "rtmp://media3.scctv.net/live/scctv_800")

      二、完整代碼示例

      #include "widget.h" #include "ui_widget.h" Widget* Widget::pThis = nullptr; Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { pThis=this; ui->setupUi(this); //創建并初始化libvlc實例 vlc_base=libvlc_new(0,nullptr); this->setWindowTitle("libvlc設計的視頻播放器"); } Widget::~Widget() { delete ui; } //選擇視頻 void Widget::on_pushButton_open_clicked() { /*選擇文件*/ filename=QFileDialog::getOpenFileName(this,"選擇打開的文件","D:/",tr("*.*")); filename="file:///"+filename; /*停止媒體文件*/ if(vlc_mediaPlayer)libvlc_media_player_stop(vlc_mediaPlayer); //QThread::msleep(5000); /*為特定文件路徑創建媒體*/ if(vlc_media)libvlc_media_release(vlc_media); // vlc_media=libvlc_media_new_path(vlc_base,filename.toUtf8().data()); vlc_media=libvlc_media_new_location (vlc_base,filename.toUtf8().data()); if(vlc_media==nullptr) { qDebug()<<"libvlc_media_new_path 執行錯誤."; return; } /*根據給定的媒體對象創建一個播放器對象*/ if(vlc_mediaPlayer)libvlc_media_player_release(vlc_mediaPlayer); vlc_mediaPlayer=libvlc_media_player_new_from_media(vlc_media); //忽略事件處理(這樣libvlc就捕獲不到鼠標和鍵盤事件了) if (vlc_mediaPlayer)libvlc_video_set_mouse_input(vlc_mediaPlayer, false); if (vlc_mediaPlayer)libvlc_video_set_key_input(vlc_mediaPlayer, false); //創建事件管理器 eventManager = libvlc_media_player_event_manager(vlc_mediaPlayer); //訂閱事件 attachEvents(eventManager); /*設置給予媒體播放器媒體輸出的win32/win64窗口句柄*/ libvlc_media_player_set_hwnd(vlc_mediaPlayer, (void *)ui->widget->winId()); /*播放媒體文件*/ if(vlc_mediaPlayer)libvlc_media_player_play(vlc_mediaPlayer); //等待VLC解析文件.否則下面的時間獲取不成功 QThread::msleep(500); //獲取媒體文件總長度 ms libvlc_time_t length = libvlc_media_player_get_length(vlc_mediaPlayer); qDebug()<<"媒體文件總長度:"<label_t2->setText(QTime(0, 0, 0,0).addMSecs(int(length)).toString(QString::fromLatin1("HH:mm:ss:zzz"))); ui->horizontalSlider_pos->setMaximum(length); ui->horizontalSlider_pos->setMinimum(0); } //暫停與繼續 void Widget::on_pushButton_pause_clicked() { if(vlc_mediaPlayer)libvlc_media_player_pause(vlc_mediaPlayer); } //停止 void Widget::on_pushButton_stop_clicked() { if(vlc_mediaPlayer)libvlc_media_player_stop(vlc_mediaPlayer); } //訂閱事件 void Widget::attachEvents(libvlc_event_manager_t *eventManager) { // 事件列表 QList events = { libvlc_MediaPlayerPositionChanged, libvlc_MediaPlayerTimeChanged, libvlc_MediaPlayerLengthChanged, libvlc_MediaPlayerPaused, libvlc_MediaPlayerPlaying, libvlc_MediaPlayerStopped, libvlc_MediaPlayerEndReached, libvlc_MediaParsedChanged }; // 訂閱事件 for (const libvlc_event_e &e : events) { libvlc_event_attach(eventManager, e, vlcEvents, nullptr); } } void Widget::vlcEvents(const libvlc_event_t *event, void *param) { qint64 pos=0; switch (event->type){ case libvlc_MediaPlayerTimeChanged: //獲取當前媒體播放的位置 pos=event->u.media_player_time_changed.new_time; pThis->ui->label_t1->setText(QTime(0, 0, 0,0).addMSecs(int(pos)).toString(QString::fromLatin1("HH:mm:ss:zzz"))); pThis->ui->horizontalSlider_pos->setValue(pos); qDebug()<<"pos:"<u.media_player_position_changed.new_position << endl; break; case libvlc_MediaPlayerLengthChanged: qDebug() << "Length:"<< event->u.media_player_length_changed.new_length; break; case libvlc_MediaPlayerEndReached: qDebug() << "VLC播放完畢."; break; case libvlc_MediaPlayerStopped: qDebug() << "VLC停止播放"; break; case libvlc_MediaPlayerPlaying: qDebug() << "VLC開始播放"; break; case libvlc_MediaPlayerPaused: qDebug() << "VLC暫停播放"; break; case libvlc_MediaParsedChanged: //獲取媒體信息 qDebug() << "獲取媒體信息"; break; } }

      5G媒體 視頻

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:用箭頭標記Excel表格中數據的增減(excel增長箭頭)
      下一篇:怎么查找想找的內容(找什么內容?)
      相關文章
      亚洲精品综合久久| 亚洲成A∨人片在线观看不卡| 国产l精品国产亚洲区在线观看| 久久亚洲精品无码av| 久久亚洲精品国产精品婷婷 | 亚洲综合一区二区精品久久| 亚洲av一综合av一区| 亚洲AV日韩精品久久久久| 亚洲中文字幕无码一区二区三区 | www国产亚洲精品久久久| 国产精品国产亚洲区艳妇糸列短篇| 亚洲白嫩在线观看| 亚洲国产精品成人精品软件| 亚洲fuli在线观看| 亚洲色偷精品一区二区三区| 亚洲国产日韩精品| 亚洲Av无码国产一区二区 | 亚洲国产成人AV网站| 在线亚洲v日韩v| 亚洲国产综合精品一区在线播放| 亚洲午夜福利精品久久| 亚洲人成网77777亚洲色| 亚洲精品高清无码视频| 亚洲电影一区二区| 亚洲最大黄色网址| 亚洲三级在线观看| 日韩亚洲综合精品国产| 亚洲一级特黄大片无码毛片| 国产∨亚洲V天堂无码久久久| 国产亚洲人成网站在线观看不卡| 亚洲av成人无码久久精品| 亚洲美女视频一区二区三区| 亚洲伊人久久大香线蕉结合| 亚洲精品无码久久| 亚洲精品美女久久久久99小说| 亚洲乱色熟女一区二区三区丝袜| 亚洲av不卡一区二区三区| 亚洲国产精品久久人人爱| 亚洲精品无码久久久久YW| 亚洲午夜无码片在线观看影院猛| 亚洲成AV人片在线观看ww|