<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    最簡單的視音頻播放示例1:總述

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    前言

    最近研究了一下Windows平臺下的視音頻播放的技術。在Windows平臺下的視頻播放技術主要有以下三種:GDI,Direct3D和OpenGL;音頻播放技術主要是DirectSound。這些技術屬于比較底層的技術,因此使用起來相對來說還是比較復雜的。我在學習的過程中也發現這一領域一直缺少比較簡單直觀的示例程序,因此打算做些示例程序,同時寫一些相關的文章,方便這一領域的人學習相關的知識。

    打算重點記錄一下視頻播放的技術。之前的研究一直集中于視頻的編解碼方面的技術,而很少接觸到視頻播放顯示方面的技術。此前的程序一直采用了調用SDL的方式播放顯示視頻畫面。而事實上,SDL本身并不具有播放顯示的功能,它只是封裝了底層播放顯示的代碼。為了做到“知其然知其所以然”,需要分析一下視頻播放的底層技術。

    在Windows平臺下視頻的播放顯示主要可以使用以下兩種技術:Direct3D和OpenGL。以上兩種顯示技術是最好的。除了以上兩種之外,還有其他的選擇。比如說DirectDraw或者GDI。但是微軟已經停止了對DirectDraw的支持。而GDI也并不是主要用于視頻顯示領域(主要用于軟件開發)。有關于他們這幾個顯示技術之間的比較的文章比較多,在這里不再細說。計劃寫5篇文章記錄三種視頻顯示技術:GDI,Direct3D,OpenGL。其中Direct3D包含簡單和復雜的兩種顯示方式:使用Surface和使用Texture;OpenGL也包含簡單和復雜的兩種顯示方式:直接畫像素和使用Texture。最后再寫一篇文章記錄一下使用SDL2顯示視頻的技術,與以上技術的代碼做一個對比。需要注意的是,Direct3D,OpenGL這些技術在3D的領域擁有大量的功能,但這些功能并不是這些文章的側重點。這些文章面向于視頻技術人員而非3D游戲開發人員,因而更加側重于它們在視頻顯示領域的應用。對于3D方面的功能則基本上會一筆帶過。

    先說一點我自己的感受。我發現作為一個搞視頻技術的人研究Direct3D,OpenGL這些顯示技術還是有一些困難的。一方面,盡管網絡上有大量的Direct3D,OpenGL方面的資料(感覺比視頻編解碼領域的資料要多很多),但是這些資料基本上都是面向于3D游戲編程的。因而翻閱了大量的資料,會學到很多和視頻顯示相關性不大的知識:比如說投影,光線等等。盡管經過這樣“堅持不懈”的學習,最后也可以掌握與視頻顯示相關性比較強的東西(比如說像紋理這方面的知識),但是這樣會消耗掉大量的時間與精力。正可謂“時間就是金錢”,這樣學習不是很經濟。另一方面,盡管偶爾還是可以找到一些OpenGL,Direct3D的顯示視頻的例子,又比較復雜。這些例子基本上都是一些“大神”的勞動成果。他們不但為了使用方便而對很多函數進行了封裝,而且還考慮到很多可能出錯的地方而寫了很多錯誤判斷的語句。這樣做對于成熟的應用來說是一件好事,但是對新手來說卻是一件壞事。因為過多的封裝會讓新手搞不清到底哪些函數是Direct3D,OpenGL的API,哪些函數是“大神”后加的。而增加過多的錯誤判斷等方面的語句之后代碼會變得很長,新手就很難分辨出究竟哪些函數才是關鍵的API。由于以上問題的存在,使得Direct3D,OpenGL這些顯示技術的學習門檻比較高,很多人也不愿意投入太多的精力去研究它。

    我記錄這幾篇文章正是為了解決之幾方面的問題而寫的。這幾篇文章在知識敘述方面只記錄OpenGL,Direct3D中和視頻顯示相關的技術,其他方面的技術盡量不寫,做到“功夫用在刀刃上”;在示例代碼方面,盡量剔除無關緊要的代碼,只保留最關鍵的函數。相信這樣會有助于更多的人學習視頻顯示方面的技術。

    這幾篇文章中的示例程序,輸入都是YUV/RGB的像素數據(注意是沒有文件頭的那種),輸出都是一個顯示視頻的窗口。由于像素數據體積比較大,因此輸入視頻的長度很短,只有幾秒鐘。



    Simplest Media Play

    有關使用Direct3D,OpenGL,GDI,DirectSound這些技術播放視音頻的代碼已經整合到了一個名為“Simplest Media Play”的工程里。該工程已經配置好并且包含了測試素材(YUV,RGB,PCM數據),直接運行即可看到結果。

     

    SourceForge項目地址:https://sourceforge.net/projects/simplestmediaplay/
    CSDN下載地址:http://download.csdn.net/detail/leixiaohua1020/8054395

     

    上述工程包含了使用各種API(Direct3D,OpenGL,GDI,DirectSound,SDL2)播放多媒體例子。其中音頻輸入為PCM采樣數據。輸出至系統的聲卡播放出來。視頻輸入為YUV/RGB像素數據。輸出至顯示器上的一個窗口播放出來。

    通過本工程的代碼初學者可以快速學習使用這幾個API播放視頻和音頻的技術。
    一共包括了如下幾個子工程:
    simplest_audio_play_directsound:  使用DirectSound播放PCM音頻采樣數據。
    simplest_audio_play_sdl2:  使用SDL2播放PCM音頻采樣數據。
    simplest_video_play_direct3d:  使用Direct3D的Surface播放RGB/YUV視頻像素數據。
    simplest_video_play_direct3d_texture:使用Direct3D的Texture播放RGB視頻像素數據。
    simplest_video_play_gdi:  使用GDI播放RGB/YUV視頻像素數據。
    simplest_video_play_opengl:  使用OpenGL播放RGB/YUV視頻像素數據。
    simplest_video_play_opengl_texture: 使用OpenGL的Texture播放YUV視頻像素數據。
    simplest_video_play_sdl2:  使用SDL2播放RGB/YUV視頻像素數據。

    工程中除了幾個子工程的源代碼之外,還包括了以下內容:

    關鍵函數調用結構圖

    工程包含了每個工程的關鍵函數調用。例如下圖是使用Direct3D的Surface播放視頻的時候的函數調用結構圖。不再一一列舉。

     RFID設備管理軟件



    測試素材

    test_bgr24_320x180.rgb:在硬盤上的存儲順序是B1G1R1, B2G2R2, B3G3R3.....

    test_bgra_320x180.rgb:在硬盤上的存儲順序是B1G1R1A1, B2G2R2A2, B3G3R3A3.....

    test_rgb24_320x180.rgb:在硬盤上的存儲順序是R1G1B1, R2G2B2, R3G3B3.....

    test_yuv420p_320x180.yuv:

    在硬盤上的存儲順序是
    YYYYYYYYYY...
    YYYYYYYYYY...
    UUUUU...
    VVVVV...

    內容截圖如下所示:

    RFID設備管理軟件

    分辨率為320x180,長度為50幀(2秒)。內容為陰天的故宮。
    注:可以使用Vooya查看RGB/YUV數據,強大而且方便。地址:http://www.offminor.de/


    NocturneNo2inEflat_44.1k_s16le.pcm:在硬盤上的存儲順序是L1L1,R1R1,L2L2,R2R2,…

    采樣率為44.1kHz,采樣位數為16bit,立體聲。內容為肖邦的《夜曲》 (Nocturne in E flat major, Op9 No2)中的起始片段。

    注:可以使用Audition這類的音頻編輯軟件查看PCM數據。

    RFID設備管理軟件

     

    結果

    工程中的視頻顯示的結果都是一樣的。彈出的窗口都是統一的500x500的大小,顯示的內容也是一模一樣,這樣也有利于比對它們之間的技術。

    同理,音頻播放的素材也是一模一樣。

    下面截圖顯示一下它們的運行結果:

    Simplest Audio Play DirectSound

    RFID設備管理軟件

    Simplest Audio Play SDL2

    RFID設備管理軟件

    Simplest Video Play Direct3D (Surface)

    RFID設備管理軟件

    Simplest Video Play Direct3D (Texture)

    RFID設備管理軟件

    Simplest Video Play GDI

    RFID設備管理軟件

    Simplest Video Play OpenGL

    RFID設備管理軟件

    Simplest Video Play OpenGL (Texture)

    RFID設備管理軟件

    Simplest Video Play SDL2

    RFID設備管理軟件

     

    from:http://blog.csdn.net/leixiaohua1020/article/details/40246783

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全