<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>
  • 網站首頁 > 物聯資訊 > 技術分享

    FFMPEG視音頻編解碼零基礎學習方法

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

    在CSDN上的這一段日子,接觸到了很多同行業的人,尤其是使用FFMPEG進行視音頻編解碼的人,有的已經是有多年經驗的“大神”,有的是剛開始學習的初學者。在和大家探討的過程中,我忽然發現了一個問題:在“大神”和初學者之間好像有一個不可逾越的鴻溝。“大神”們水平高超,探討著深奧的問題;而初學者們還停留在入門階段。究竟是什么原因造成的這種“兩極分化”呢?最后,我發現了問題的關鍵:FFMPEG難度比較大,卻沒有一個循序漸進,由簡單到復雜的教程。現在網上的有關FFMPEG的教程多半難度比較大,不太適合剛接觸FFMPEG的人學習;而且很多的例子程序編譯通不過,極大地打消了學習的積極性。我自己在剛開始學習FFMPEG的時候也遇到了很大的困難。為了幫助更多的人快速成為“大神”,我想總結一個學習FFMPEG的方法,方便大家循序漸進的學習FFMPEG。

    RFID設備管理軟件

    0. 背景知識

    本章主要介紹一下FFMPEG都用在了哪里(在這里僅列幾個我所知的,其實遠比這個多)。說白了就是為了說明:FFMPEG是非常重要的。

    使用FFMPEG作為內核視頻播放器:

    Mplayer,ffplay,射手播放器,暴風影音,KMPlayer,QQ影音...

    使用FFMPEG作為內核的Directshow Filter:

    ffdshow,lav filters...

    使用FFMPEG作為內核的轉碼工具:

    ffmpeg,格式工廠...

    事實上,FFMPEG的視音頻編解碼功能確實太強大了,幾乎囊括了現存所有的視音頻編碼標準,因此只要做視音頻開發,幾乎離不開它。

     

    1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe)

    本章主要介紹一下ffmpeg工程包含的三個exe的使用方法。

    ffmpeg的官方網站是:http://ffmpeg.org/

    編譯好的windows可用版本的下載地址(官網中可以連接到這個網站,和官方網站保持同步): http://ffmpeg.zeranoe.com/builds/

    該網站中的FFMPEG分為3個版本:Static,Shared,Dev。

    前兩個版本可以直接在命令行中使用,他們的區別在于:Static里面只有3個應用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每個exe的體積都很大,相關的Dll已經被編譯到exe里面去了。Shared里面除了3個應用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,還有一些Dll,比如說avcodec-54.dll之類的。Shared里面的exe體積很小,他們在運行的時候,到相應的Dll中調用功能。

    Dev版本是用于開發的,里面包含了庫文件xxx.lib以及頭文件xxx.h,這個版本不包含exe文件。

    打開系統命令行接面,切換到ffmpeg所在的目錄,就可以使用這3個應用程序了。

    1.1 ffmpeg.exe

    ffmpeg是用于轉碼的應用程序。

    一個簡單的轉碼命令可以這樣寫:

    將input.avi轉碼成output.ts,并設置視頻的碼率為640kbps

     

    [plain] view plaincopy在CODE上查看代碼片派生到我的代碼片  
    1. ffmpeg -i input.avi -b:v 640k output.ts  

    具體的使用方法可以參考: ffmpeg參數中文詳細解釋

     

    詳細的使用說明(英文):http://ffmpeg.org/ffmpeg.html

    1.2 ffplay.exe

    ffplay是用于播放的應用程序。

    一個簡單的播放命令可以這樣寫:

    播放test.avi

     

    [plain] view plaincopy在CODE上查看代碼片派生到我的代碼片  
    1. ffplay test.avi  

    具體的使用方法可以參考:ffplay的快捷鍵以及選項

     

    詳細的使用說明(英文):http://ffmpeg.org/ffplay.html

    1.3 ffprobe.exe

    ffprobe是用于查看文件格式的應用程序。

    這個就不多介紹了。

    詳細的使用說明(英文):http://ffmpeg.org/ffprobe.html

     

    2. ffmpeg庫的使用:視頻播放器

    本章開始介紹使用ffmpeg的庫進行開發。

    2.1 ffmpeg庫的配置

    http://ffmpeg.zeranoe.com/builds/網站上

    1.下載Dev版本,里面包含了ffmpeg的xxx.h頭文件以及xxx.lib庫文件。

    2.下載Shared版本,里面包含了ffmpeg的dll文件。

    3.將這兩部分文件拷貝到VC工程下面就可以了

    注:可能會出現問題,參見:FFMPEG 庫移植到 VC 需要的步驟

    如果不想自己手動配置,可以下載已經配置好的工程:最簡單的基于FFMPEG+SDL的視頻播放器

    2.2 最簡單的視頻播放器

    學習文章《100行代碼實現最簡單的基于FFMPEG+SDL的視頻播放器》中的代碼,這是ffmpeg做視頻播放器最簡單的代碼了,是我自己精簡出來的,已經不能再簡化了,每一行都很重要。

    ffmpeg的函數介紹:ffmpeg函數介紹

    注1:播放視頻或音頻數據的時候會用到SDL。有關SDL可以參考:SDL介紹

             SDL參考文檔:SDL GUIDE 中文譯本

    注2:如果想查看解碼后的數據,需要用到 YUV播放器:YUV播放器源代碼YUV Player Deluxe都可以

    2.3 相關結構體的研究

    ffmpeg的結構體之間的關系參考文章:FFMPEG中最關鍵的結構體之間的關系

    結構體中每個變量的分析,參考文章:

    FFMPEG結構體分析:AVFrame

    FFMPEG結構體分析:AVFormatContext
    FFMPEG結構體分析:AVCodecContext
    FFMPEG結構體分析:AVIOContext
    FFMPEG結構體分析:AVCodec
    FFMPEG結構體分析:AVStream
    FFMPEG結構體分析:AVPacket

     

     

    3. ffmpeg庫的使用:音頻播放器

    3.1 最簡單的音頻播放器

    學習文章《最簡單的基于FFMPEG+SDL的音頻播放器》 中的代碼,和最簡單的視頻播放器一樣,這是最簡單的音頻播放器,每一行代碼都很重要。

    注:如果想要查看解碼后的數據(PCM數據),需要用到Audition。

    4. ffmpeg庫的使用:一個真正的播放器——ffplay

    4.1 真正的播放器

    ffplay流程圖如文章《FFplay源代碼分析:整體流程圖》 所示。ffplay代碼比較復雜,但是其核心代碼和《100行代碼實現最簡單的基于FFMPEG+SDL的視頻播放器》 是一樣的。可以兩個工程結合著學習。

    ffplay代碼簡介資料:如何用FFmpeg編寫一個簡單播放器

    ffplay使用說明:ffplay的快捷鍵以及選項

    ffplay已經移植到VC下的工程:ffplay_vc2005(別人做的,質量很不錯)

    ffplay移植到MFC下的工程,包含了簡單的圖形界面和一些控制按鈕:ffplay播放器移植VC的工程:ffplay for MFC

     

    5. ffmpeg庫的使用:編碼

    5.1 編碼

    ffmpeg編碼我自己研究的不是很多,可以參考文章 :使用FFmpeg類庫實現YUV視頻序列編碼為視頻

    上面那篇文章是用的類庫比較舊,新版類庫的的使用可以參考下面幾篇文章。

    圖像的編碼可以參考:最簡單的基于FFMPEG的圖像編碼器(YUV編碼為JPEG)

    音頻的編碼可以參考:最簡單的基于FFMPEG的音頻編碼器(PCM編碼為AAC)

    視頻的編碼可以參考:最簡單的基于FFMPEG的視頻編碼器(YUV編碼為H.264)

    5.2 轉碼

    轉碼實際上是先解碼然后編碼。

    不進行轉碼,只進行封裝格式轉換的程序可參考:最簡單的基于FFMPEG的封裝格式轉換器(無編解碼)

    轉碼程序可參考:最簡單的基于FFMPEG的轉碼程序

    比較復雜的轉碼程序可以參考ffmpeg.c,它移植到MFC下的工程:ffmpeg轉碼器移植VC的工程:ffmpeg for MFC

    6. ffmpeg源代碼分析

    通曉了ffmpeg庫的使用以后,可以看一下ffmpeg的源代碼。注意ffmpeg的源代碼只有在linux下才能編譯,在windows下可以使用MinGW進行編譯。推薦使用Eclipse查看ffmpeg的源代碼。

    有一個很完整的ffmpeg源代碼的分析文檔:ffdoc

    ffmpeg源代碼分析文章列表如下。

    庫函數分析:

    圖解FFMPEG打開媒體的函數avformat_open_input

    ffmpeg 源代碼簡單分析 : av_register_all()
    ffmpeg 源代碼簡單分析 : avcodec_register_all()
    ffmpeg 源代碼簡單分析 : av_read_frame()
    ffmpeg 源代碼簡單分析 : avcodec_decode_video2()
    FFMPEG源碼分析:avformat_open_input()(媒體打開函數)

     

    ffmpeg.exe源代碼分析:

    ffmpeg源碼分析:transcode_init()函數
    ffmpeg源碼分析:transcode()函數

    7. ffmpeg相關工程的學習

    學習完成ffmpeg,還可以了解一下基于ffmpeg的相關的多媒體開源工程,在這里推薦以下幾個:

    7.1 ffdshow

    ffdshow是基于ffmpeg的解碼器類庫libavcodec的DirectShow Filter。廣泛安裝在PC上。

    RFID設備管理軟件

    有關ffdshow的源代碼分析文章(更新中):

    ffdshow 源代碼分析1 : 整體結構
    ffdshow 源代碼分析 2: 位圖覆蓋濾鏡(對話框部分Dialog)

    ffdshow 源代碼分析 3: 位圖覆蓋濾鏡(設置部分Settings)
    ffdshow 源代碼分析 4: 位圖覆蓋濾鏡(濾鏡部分Filter)
    ffdshow 源代碼分析 5: 位圖覆蓋濾鏡(總結)
    ffdshow 源代碼分析 6: 對解碼器的dll的封裝(libavcodec)
    ffdshow 源代碼分析 7: libavcodec視頻解碼器類(TvideoCodecLibavcodec)
    ffdshow 源代碼分析 8: 視頻解碼器類(TvideoCodecDec)
    ffdshow 源代碼分析 9: 編解碼器有關類的總結

     

    7.2 LAV filters

    LAV Filter是基于ffmpeg的解碼器類庫libavcodec,以及解封裝器類庫libavformat的DirectShow Filter。廣泛安裝在PC上。

    有關LAV Filter的源代碼分析文章:

    LAV Filter 源代碼分析 1: 總體結構

    LAV Filter 源代碼分析 2: LAV Splitter

    LAV Filter 源代碼分析 3: LAV Video (1)

    LAV Filter 源代碼分析 4: LAV Video (2)

     

    7.3 Mplayer

    Mplayer是Linux下使用最廣泛的播放器,也有Windows版本的。其中使用了ffmpeg。

    RFID設備管理軟件

    有關Mplayer的源代碼分析文章:

    MPlayer源代碼分析

    7.4 Media Player Classic - HC

    現在廣為使用很多播放器都是構建于Media Player Classic - HC的基礎之上的。

    RFID設備管理軟件

    有關Media Player Classic - HC的源代碼分析文章:

    Media Player Classic - HC 源代碼分析 1:整體結構
    Media Player Classic - HC 源代碼分析 2:核心類 (CMainFrame)(1)
    Media Player Classic - HC 源代碼分析 3:核心類 (CMainFrame)(2)
    Media Player Classic - HC 源代碼分析 4:核心類 (CMainFrame)(3)
    Media Player Classic - HC 源代碼分析 5:關于對話框 (CAboutDlg)
    Media Player Classic - HC 源代碼分析 6:MediaInfo選項卡 (CPPageFileMediaInfo)
    Media Player Classic - HC 源代碼分析 7:詳細信息選項卡(CPPageFileInfoDetails)

     

     

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

    7.5 XBMC

    XBMC是一個優秀的自由和開源的(GPL)媒體中心軟件。

    RFID設備管理軟件

    有關XBMC源代碼分析文章:

    XBMC源代碼分析 1:整體結構以及編譯方法

    XBMC源代碼分析 2:Addons(皮膚Skin)

    XBMC源代碼分析 3:核心部分(core)-綜述

    XBMC源代碼分析 4:視頻播放器(dvdplayer)-解碼器(以ffmpeg為例)

    XBMC源代碼簡析 5:視頻播放器(dvdplayer)-解復用器(以ffmpeg為例)

    XBMC源代碼分析 6:視頻播放器(dvdplayer)-文件頭(以ffmpeg為例)

    XBMC源代碼分析 7:視頻播放器(dvdplayer)-輸入流(以libRTMP為例)

     

    8.FFmpeg其它方面的功能

    在這里介紹一下FFmpeg中AVFilter的使用。AVFilter可以給試飲品添加各種處理效果。有一個簡單的例子,是給視頻添加水印:

    最簡單的基于FFmpeg的AVfilter例子(水印疊加)

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