2019-10-24更新:
1.更新為ffmpeg4.1,同時支援播放h265。
下載下傳位址:https://download.csdn.net/download/qq214517703/11914710
Github位址:https://github.com/yundiantech/FFMPEG_DEMO/tree/master/source/VideoDecode
代碼講解視訊位址:http://blog.yundiantech.com/?log=blog&id=41
以下例子中的代碼使用的是ffmpeg2.5.2,我已經放棄它了,也不建議大家看了。
我不打算删除,留着做個紀念吧。
現在,我們已經簡單的掌握了h.264資料的結構。是時候幹點什麼了,那就先來寫一個H.264視訊播放器吧。。
前面我們開發視訊播放器的時候是通過:
avformat_open_input打開視訊檔案,然後再調用av_read_frame就可以讀到一幀幀的資料了,
當然用這樣的方法也可以直接打開并讀取一個h.264檔案,但是這樣就違背了我們的初衷了,我們的目的是對上一節《H264資料格式講解》的實踐,是以我們采用C語言的檔案操作直接讀取檔案然後再解析。
一個H264播放器的實作步驟大緻如下:
一、從H.264檔案中擷取一個NALU
從上節可以知道,h264的NALU直接是用幀頭(0x00000001或0x000001)隔開的,是以我們就逐個位元組搜尋,直到遇到h264的幀頭,2個幀頭之間的資料就是一個Nalu,既視為擷取到了一幀h264視訊資料。
查找一個nalu資料的代碼大緻如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | |
二、使用ffmpeg解碼上面擷取到的NALU
1.h264解碼器初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
2.解碼并轉成rgb32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | |
三、使用Qt顯示圖像
直接用QImage加載得到的rgb32資料即可:
1 2 3 4 5 | |
然後在主線程顯示出這個QImage即可。
四、播放速度控制
由于H264資料裡面沒有包含時間戳資訊,是以隻能根據幀率來做同步,舉個栗子:比如視訊幀率是15那麼我們就每秒鐘播放15張圖像,既在顯示完一幀圖像後,延時(1000/15)毫秒,當然嚴格來說這個延時不大合理,因為他沒有考慮解碼消耗的時間,但我們不管他,有興趣的自己去完善修改。
另外需要注意的是:視訊幀率是在h264的Nalu資料裡面的,是以需要成功解碼一幀圖像後才能擷取到幀率資訊。
主要代碼大緻如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | |
至此,一個完整的h264播放器就完成了。
H264測試檔案下載下傳位址:https://download.csdn.net/download/qq214517703/10422777
完整工程下載下傳位址:https://download.csdn.net/download/qq214517703/10423384
======Bug修複 Begin =======
2019-01-18更新:
1.修複部分h264檔案,一幀存在多個slice,播放花屏的問題。
下載下傳位址:https://download.csdn.net/download/qq214517703/10924057
====== End =======
音視訊技術交流讨論歡迎加 QQ群 121376426