《ffplay的數據結構分析》
《ffplay分析(視頻解碼線程的操作)》
《ffplay分析(音頻解碼線程的操作)》
《ffplay 分析(音頻從Frame(解碼后)隊列取數據到SDL輸出)》
《ffplay分析 (視頻從Frame(解碼后)隊列取數據到SDL輸出)》
《ffplay分析 (音視頻同步:主時鐘為音頻)》
《ffplay分析 (暫停 / 播放處理)》
《ffplay分析 (seek操作處理)》
ffplay從啟動到讀取線程的操作分析(版本:ffmpeg-4.2.1)
- 一、分析:
- 1、main():初始化ffmpeg
- 2、main():ffplay 命令行參數的解析處理
- 3、main():SDL初始化
- 4、main():解碼器的沖刷Packet初始化
- 5、main():SDL創建窗口
- 6、main():打開各種流并且啟動讀取數據線程
- 7、stream_open():分配VideoState保存文件名
- 8、stream_open():初始化Frame隊列(解碼后)/Packet隊列(解碼前),初始化用于控制讀取線程休眠的條件變量
- 9、stream_open():初始化時鐘、初始化音量
- 10:stream_open():啟動讀取數據線程
- 11:read_thread():初始化各個流的默認索引值、初始化ffmpeg讀取中斷回調函數
- 12、read_thread():打開文件操作(avformat_open_input()、avformat_find_stream_info())
- 13、read_thread():處理是否指定播放的起始時間和是否是實時流數據
- 14、read_thread():設置各個流的流索引
- 15、read_thread():設置顯示窗口寬高
- 16、read_thread():打開各個流操作
- 17、read_thread():實時流判斷設置緩沖區不限制
- 18、read_thread():循環讀取數據(判斷是否請求退出、是否暫停網絡流操作)
- 19、read_thread():循環讀取數據(判斷是否有seek操作)
- 20、read_thread():循環讀取數據(判斷video是不是attachments_pic)
- 21、read_thread():循環讀取數據(判斷隊列是否已經有足夠的數據)
- 22、read_thread():循環讀取數據(判斷是否已經播放完畢)
- 23、read_thread():循環讀取數據(執行av_read_frame()讀取幀數據)
- 24、read_thread():循環讀取數據(判斷幀是否在播放范圍內,插入到相應的Packet(解碼前)隊列)
- 25、read_thread():循環讀取數據(線程退出處理)
一、分析:
1、main():初始化ffmpeg
2、main():ffplay 命令行參數的解析處理
3、main():SDL初始化
4、main():解碼器的沖刷Packet初始化
5、main():SDL創建窗口
6、main():打開各種流并且啟動讀取數據線程
7、stream_open():分配VideoState保存文件名
8、stream_open():初始化Frame隊列(解碼后)/Packet隊列(解碼前),初始化用于控制讀取線程休眠的條件變量
9、stream_open():初始化時鐘、初始化音量
10:stream_open():啟動讀取數據線程
11:read_thread():初始化各個流的默認索引值、初始化ffmpeg讀取中斷回調函數
12、read_thread():打開文件操作(avformat_open_input()、avformat_find_stream_info())