音視頻項目—基于FFmpeg和SDL的音視頻播放器解析(二十二)

介紹

在本系列,我打算花大篇幅講解我的 gitee 項目音視頻播放器,在這個項目,您可以學到音視頻解封裝,解碼,SDL渲染相關的知識。您對源代碼感興趣的話,請查看基于FFmpeg和SDL的音視頻播放器

如果您不理解本文,可參考我的前一篇文章音視頻項目—基于FFmpeg和SDL的音視頻播放器解析(二十一)

解析

我們播放器所有的類已經解析完了,我們來看一下 main 函數如何使用函數,實現音視頻的播放。

#include <iostream>
#include "log.h"
#include "demuxthread.h"
#include "avframequeue.h"
#include "decodethread.h"
#include "audiooutput.h"
#include "videooutput.h"
using namespace std;#undef main
int main(int argc, char *argv[])
{int ret = 0;cout << "Hello World!" << endl;LogInit();// queueAVPacketQueue audio_packet_queue;AVPacketQueue video_packet_queue;AVFrameQueue audio_frame_queue;AVFrameQueue video_frame_queue;AVSync avsync;avsync.InitClock();//1 .解復用DemuxThread *demux_thread = new DemuxThread(&audio_packet_queue, &video_packet_queue);ret = demux_thread->Init(argv[1]);if(ret < 0) {LogError("demux_thread.Init failed");return -1;}ret = demux_thread->Start();if(ret < 0) {LogError("demux_thread.Start() failed");return -1;}// 解碼線程初始化DecodeThread *audio_decode_thread = new DecodeThread(&audio_packet_queue, &audio_frame_queue);ret = audio_decode_thread->Init(demux_thread->AudioCodecParameters());if(ret < 0) {LogError("audio_decode_thread->Init() failed");return -1;}ret = audio_decode_thread->Start();if(ret < 0) {LogError("audio_decode_thread->Start() failed");return -1;}DecodeThread *video_decode_thread = new DecodeThread(&video_packet_queue, &video_frame_queue);ret = video_decode_thread->Init(demux_thread->VideoCodecParameters());if(ret < 0) {LogError("video_decode_thread->Init() failed");return -1;}ret = video_decode_thread->Start();if(ret < 0) {LogError("video_decode_thread->Start() failed");return -1;}// 初始化audio輸出AudioParams audio_params = {0};memset(&audio_params, 0, sizeof(AudioParams));audio_params.channels = demux_thread->AudioCodecParameters()->channels;audio_params.channel_layout = demux_thread->AudioCodecParameters()->channel_layout;audio_params.fmt = (enum AVSampleFormat) demux_thread->AudioCodecParameters()->format;audio_params.freq = demux_thread->AudioCodecParameters()->sample_rate;audio_params.frame_size =demux_thread->AudioCodecParameters()->frame_size;AudioOutput *audio_output = new AudioOutput(&avsync, demux_thread->AudioStreamTimebase(), audio_params, &audio_frame_queue);ret = audio_output->Init();if(ret < 0) {LogError("audio_output->Init() failed");return -1;}VideoOutput *video_output = new VideoOutput(&avsync, demux_thread->VideoStreamTimebase(),&video_frame_queue, demux_thread->VideoCodecParameters()->width,demux_thread->VideoCodecParameters()->height);ret = video_output->Init();if(ret < 0) {LogError("video_output->Init() failed");return -1;}video_output->MainLoop();// 休眠120秒
//    std::this_thread::sleep_for(std::chrono::milliseconds(120*1000));LogInfo("demux_thread->Stop");demux_thread->Stop();LogInfo("delete demux_thread");delete demux_thread;LogInfo("audio_decode_thread->Stop()");audio_decode_thread->Stop();LogInfo("delete audio_decode_thread");delete audio_decode_thread;LogInfo("video_decode_thread->Stop()");video_decode_thread->Stop();LogInfo("delete video_decode_thread");delete video_decode_thread;LogInfo("main finish");return 0;
}

基本流程就是解復用——》解碼——》輸出音頻 / 輸出視頻

好了,未來如果有需要的再深入解析這個 main,現在這個項目先告一段落。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167906.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167906.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL 排序和分組怎么做?

文章目錄 前言MySQL 排序語法在命令提示符中使用 ORDER BY 子句在PHP腳本中使用 ORDER BY 子句 MySQL 分組GROUP BY 語法實例演示使用 WITH ROLLUP 后言 前言 hello world歡迎來到前端的新世界 &#x1f61c;當前文章系列專欄&#xff1a;Mysql &#x1f431;?&#x1f453;博…

Cookie的基本使用

JavaScript Cookie&#xff08;JavaScript 的 Cookie&#xff09;是一種在Web瀏覽器中存儲和檢索用戶信息的機制。它允許網站在用戶計算機上存儲小型數據片段&#xff0c;以便在之后的會話中使用這些數據。Cookie通常用于持久化用戶首選項、跟蹤用戶行為和提供個性化體驗。 通…

堆的實現(堆的插入、堆的刪除等)超級全

堆的實現&#xff08;堆的插入、堆的刪除等&#xff09;超級全 文章目錄 堆的實現&#xff08;堆的插入、堆的刪除等&#xff09;超級全一、前期基礎知識1.樹結構①樹的定義②樹的相關概念③二叉樹④滿二叉樹和完全二叉樹a.滿二叉樹b.完全二叉樹 ⑤二叉樹的性質⑥二叉樹順序結構…

每日OJ題_算法_雙指針_力扣11. 盛最多水的容器

力扣11. 盛最多水的容器 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 難度 中等 給定一個長度為 n 的整數數組 height 。有 n 條垂線&#xff0c;第 i 條線的兩個端點是 (i, 0) 和 (i, height[i]) 。 找出其中的兩條線&#xff0c;使得它們與 x 軸共同構成…

2023 最新 PDF.js 在 Vue3 中的使用

因為自己寫業務要定制各種 pdf 預覽情況&#xff08;可能&#xff09;&#xff0c;所以采用了 pdf.js 而不是各種第三方封裝庫&#xff0c;主要還是為了更好的自由度。 一、PDF.js 介紹 官方地址 中文文檔 PDF.js 是一個使用 HTML5 構建的便攜式文檔格式查看器。 pdf.js 是社區…

人工智能教程(二):人工智能的歷史以及再探矩陣

目錄 前言 更多矩陣的知識 Pandas 矩陣的秩 前言 在上一章中&#xff0c;我們討論了人工智能、機器學習、深度學習、數據科學等領域的關聯和區別。我們還就整個系列將使用的編程語言、工具等做出了一些艱難的選擇。最后&#xff0c;我們還介紹了一點矩陣的知識。在本文中&am…

vue打包上傳服務器的總結筆記

經歷了3個小時教訓&#xff0c;還是自己總結一下吧&#xff0c;致未來傻x的自己。 第一步&#xff0c;打開b站。搜索【vue打包】找到一個視頻教程 前端Vue項目打包部署實戰教程_嗶哩嗶哩_bilibili 這步是在看不懂下面操作的情況下用的 第一步&#xff1a;找到nginx的配置文件…

需求變更導致估算不精準 6大措施

需求變更可能導致估算不精準、項目成本增加、進度延遲等問題&#xff0c;如果不能準確地估算項目&#xff0c;往往會造成資源浪費和開發效率的降低&#xff0c;因此亟需解決因需求變更導致地估算不精準的問題。 一般來說&#xff0c;主要是從以下6個方面入手解決&#xff1a; 1…

【maven】【IDEA】idea中使用maven編譯項目,報錯java: 錯誤: 找不到符號 【2】

idea中使用maven編譯項目,報錯java: 錯誤: 找不到符號 錯誤狀況展示: 如果報這種錯,是因為項目中真的找不到報錯的方法或者枚舉 字段之類的,但實際是 : 點擊 File Path

OSG粒子系統與陰影-霧效模擬(1)

虛擬現實中有很多效果&#xff0c;如雨效、雪效、霧效等&#xff0c;這些都可以通過粒子系統來實現。一個真實的粒子系統的模式能使三維場景達到更好的效果。 本章對OSG粒子系統的使用以及生成自定義粒子系統的方法進行了詳細介紹最后還附帶說明了陰影的使用方法。在實時的場景…

(HAL庫版)freeRTOS移植STMF103

正點原子關于freeRTOS的教程是比較好的&#xff0c;可惜移植的是標準庫&#xff0c;但是我學的是Hal庫&#xff0c;因為開發速度更快&#xff0c;從最后那個修改SYSTEM文件夾的地方開始替換為下面的內容就可以了 5.修改Systick中斷、SVC中斷、PendSV中斷 將SVC中斷、P…

pairplot

Python可視化 | Seaborn5分鐘入門(七)——pairplot - 知乎 (zhihu.com) Seaborn是基于matplotlib的Python可視化庫。它提供了一個高級界面來繪制有吸引力的統計圖形。Seaborn其實是在matplotlib的基礎上進行了更高級的API封裝&#xff0c;從而使得作圖更加容易&#xff0c;不需…

紅黑樹詳解

紅黑樹的概念與性質 前置知識 在學習紅黑樹之前&#xff0c;最好有二叉查找樹和AVL樹的基礎&#xff0c;因為紅黑樹本質就是一種特殊的二叉查找樹&#xff0c;而紅黑樹的操作中需要用到AVL樹中旋轉的相關知識。至于二叉查找樹和AVL樹&#xff0c;可以參考如下兩篇博客&#xf…

oracle安裝的肘腋之疾小合集

#臨時空間指定 export TMP/tmp export TMPDIR/tmp #圖形化顯示框不全 java問題&#xff0c;使用系統自帶的jre ./runInstaller -jreLoc/usr/local/jdk1.7.0_80/ #ins30131 Failed to access the temporary location 給/tmp/CVU*加x權限 #linux桌面太小 xrandr -s 1440x900_60…

Matplotlib圖形注釋_Python數據分析與可視化

Matplotlib圖形注釋 添加注釋文字、坐標變換 有的時候單單使用圖形無法完整清晰的表達我們的信息&#xff0c;我們還需要進行文字進行注釋&#xff0c;所以matplotlib提供了文字、箭頭等注釋可以突出圖形中重點信息。 添加注釋 為了使我們的可視化圖形讓人更加容易理解&#…

vue中父組件直接調用子組件方法

vue2 中&#xff0c;父組件如何調用子組件的方法 在Vue 2中&#xff0c;父組件可以通過使用ref屬性來引用子組件的實例&#xff0c;然后通過該實例調用子組件的方法。 首先&#xff0c;在父組件的模板中&#xff0c;給子組件添加一個ref屬性&#xff1a; <template>&l…

在工業生產環境下,服務器沒有互聯網,如何通過代理自己的電腦上互聯網?

服務器主機是CentOS7操作系統.&#xff0c;服務器的局域網是10.0.6.x網段。我的筆記本的以太網口的局域網ip是也是10.0.6.x&#xff0c;由于這個10.0.6.x的整個局域網是沒有撥號上網的所有無法訪問互聯網。 但是&#xff0c;如果筆記本臉上wifi&#xff0c;wifi的網段是192.168…

長度最小的子數組

給定一個含有 n 個正整數的數組和一個正整數 target 。 找出該數組中滿足其總和大于等于 target 的長度最小的 連續子數組 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其長度。如果不存在符合條件的子數組&#xff0c;返回 0 。 示例 1&#xff1a; 輸入&#x…

MySQL 有多個普通索引時會取哪一個索引?

我們都知道MySQL在查詢時底層會進行索引的優化&#xff0c;假設有兩個普通索引&#xff0c;且where 后面也根據這兩個普通索引查詢數據&#xff0c;那么執行查詢語句時會使用到那個索引&#xff1f; 為了方便演示&#xff0c;新建users表&#xff0c;新建idx_name、idx_city這兩…

前端vue導出PPT,使用pptxgen.js

前言 公司新需求需要導出ppt給業務用&#xff0c;查閱資料后發現也挺簡單的&#xff0c;記錄一下。 如有不懂的可以留言&#xff01;&#xff01;&#xff01; 1.安裝包 npm install pptxgenjs --save2.引入包 在需要使用的文件中引入 import Pptxgenfrom "pptxgenjs&…