如何用C++從API開始,寫一款Windows上的視頻播放器?

除了一些解碼庫和簡單的GUI庫之外,希望儘可能的自己動手做。但是沒有思路。VLC雖然開源,但是源碼似乎讀不懂。。。(表示能力有限)。知道有一款QtAV,然而並不想用Qt。希望自己可以獨立封裝出一個視頻播放器的框架。主要目的是練手,無商業用途。求大神指點思路。


#include &
#include &
#include &

int main(void)
{
char message[100];
mciSendStringA("Open "C:\Users\Public\Videos\Sample Videos\Wildlife.wmv" type mpegvideo Alias MyVideo", message, 100, 0);
printf("open: %s
", message);
mciSendStringA("Play MyVideo FullScreen", message, 100, 0);
Sleep(10000);
mciSendStringA("Close MyVideo", "", 0, 0);
return 0;
}

windows 現成的框架多的是,你如果就像寫個簡單視頻播放功能,那上面這三行mciSendString就夠了,編譯運行下,就能全屏播放視頻了(請保證你C:userspublicvideossample videoswildlife.wmv存在),夠簡單吧,既容易使用又可以精細控制視頻尺寸,進度,獨立窗口還是子窗口,播放,暫停,音量,進度,從哪裡播放到哪裡,簡單放點視頻,mp3,符合你要求:

1. 不用QtAv

2. 直接使用 Windows API。

根據你的情況,你花個周末就能搞定了。


簡單來說,一個視頻播放器包含以下幾個部分:

  • 文件格式解析(Demuxer)

  • 音視頻解碼(Decoder)

  • 音視頻渲染輸出(Renderer)

FFmpeg中都有對應的實現——avformat、avcodec、avdevice

樓主想自己實現的應該是Renderer,如果不藉助SDL或者DShow之類的話,視頻渲染有幾種方式:

  • CPU上實現YUV/RGB轉換,用GDI繪製

  • GPU上實現YUV/RGB轉換,用D3D/OpenGL繪製

音頻輸出用WinMM,MSDN可查。


解碼器和GUI都不是自己的,你確定你要寫一個拖拖按鈕什麼的就能實現的殼?


Windows Media Foundation,三兩下就能在HWND上播放視頻了。至於HWND怎麼弄這個已經有幾十年的文章可以看了。

How to Play Media Files with Media Foundation (Windows)

為什麼不看MSDN


先說清楚,解碼器是自己做,還是調別人的


人家題主是個新手,或許還不知道播放器的核心在哪裡,但是你們這種冷嘲熱諷又是何必,話說你們做視頻解碼的會寫解碼器嗎,題主其實你假如只是想寫個Windows應用,倒是按輪子哥的建議沒錯,要是想實現自己的解碼器,看官方文檔(我只看過h264官方文檔),裡面連函數名都基本幫你定好了,當然你得有一些視頻壓縮的基本知識,我個人覺得其實從編碼器開始入手好些,等你知道了編碼器的基本理論之後,解碼器就是個解碼的,其實寫個玩具出來也沒那麼難


1、首先baidu FFmpeg

2、下載Download FFmpeg

3、如何編譯windows版本?有點複雜

How to Install FFmpeg on Windows: 10 Steps (with Pictures)

中文:

如何在Windows上安裝FFmpeg程序

切記:下載Dev版本

直接上代碼

ffmpeg視頻播放器源代碼

ouloba/MyVideo · GitHub

該項目依賴於lae界面開發系統

lae下載地址:lae界面系統,開發平台.適用於APP、軟體、遊戲等開發

lae開發教程視頻:2個小時極速開發Native APP實例YahooNews_土豆

約泡泡APP視頻教程極速開發App_土豆


自己寫解碼器不現實,可以直接從FFmpeg開始,文件解析和解碼器都有了,渲染用GDI或者D3D或者SDL,也可以從MediaFoundation開始,這是我見過的設計的最好的播放器架構了。DirectShow請直接無視,學習的價值都沒有。

如果想更進一步,可以直接對著標準文檔寫文件解析器,比如解析MP4文件,然後自己調用解碼器比如用FAAD解碼AAC音頻,用FFmpeg或MediaFoundation的組件解碼H.264。


再次安利 SDL Simple DirectMedia Layer

教程在此 Lazy Foo" Productions

Lesson 01 教你如何設置開發環境,3個平台都有

Lesson 02 教你如何創建一個窗口,並顯示一個圖片

Lesson 03 教你如何響應用戶事件

Lesson 04 教你如何處理鍵盤輸入

Lesson 05 顯示優化以及圖片大小的問題

Lesson 06 教你如何載入其他格式的圖片

Lesson 07 教你使用Texture

Lesson 08 教你如何繪製圖形

Lesson 09 教你使用Viewport

Lesson 10 背景色的處理(?),本人渣,不會翻Color Keying Here we"ll use color keying to give texture transparent backgrounds.

Lesson 11 教你如何只顯示自己需要的部分

Lesson 12 顏色疊加(?)好吧,我是渣〒_〒

Lesson 13 教你設置透明度

Lesson 14 帶垂直同步的小動畫

Lesson 15 教你翻轉圖像

Lesson 16 教你使用其他的字體渲染文字

Lesson 17 教你處理滑鼠事件

Lesson 18 教你處理鍵盤按鍵狀態

Lesson 19 教你從其他設備獲取輸入,比如手柄

Lesson 20 接著教你處理輸入

Lesson 21 教你如何處理音樂

然後你再去看ffmpeg,解碼視頻後用SDL輸出


ffmpeg的ffplay可以看下,用了ffmpeg和sdl。(?≧?≦?)可以一起。


只是想寫一個視頻播放器的「殼子」的話不如上 C#。

實在找不到折騰 Win32 API 的理由。


取決於你做軟體的目的。如果想從零開始,那你至少都寫音,視頻解碼器,學習如何渲染畫面,太多了……。如果不想這樣,按樓上說的就行。


分成兩個方面來做這個事情,如果限定一定要是C++的話,牆裂不建議使用win32來儘快的做GUI,因為你光寫界面就需要1年23333.也就是用使用ui庫了,新手推薦mfc/wxwidget,老手推薦QT。

其他的,說真的,你想盡量多學習點東西的話,用這些就夠了。

視頻解碼的話,也必須用庫,簡單的話,用用vfw吧,雖然有點坑,不過還是能擼出一個視頻播放器的。或者可以去弄ffmpeg。。。你心愛的暴風影音,QQ影音等都在它的恥辱榜上(逃

什麼,你說Dshow?想想得了。。。

嗯,以上經驗得益於我在10年的時候這麼干過。如果過時,大神不要噴我。


推薦閱讀:

C++重載運算符如何確定運算符位置?
看了很多技術書,為啥仍然寫不出項目?
C++ 如何生成大隨機數?
C++ 如何寫一個函數,使得它的返回值是指向該函數自身的指針?
斷言、異常和返回值的選擇問題?

TAG:多媒體播放器軟體 | Java | C | C# | Windows開發 |