在視頻播放器的開發中,有兩個重要的概念——視頻Track和音頻Track,即視頻流和音頻流。“流”是個 抽象的詞,用來表示“一連串的通過時間來串連的數據元素”。流中的數據元素稱爲 幀(frames)。 不同的流是由不同的編碼器(codec)來編碼生成的。編解碼器定義 了流中的數據是如何被編碼COded和解碼DECoded的,因此它的名字叫做CODEC。 常用的編解碼器有Divx和MP3等。從流中讀出來的數據叫做包(packets),包是一 段數據,它包含了一段可解碼成幀的數據,這些幀就是我們要在應用程序處理的東西 (如播放音頻幀或視頻幀等)。
每個包要麼包含了一個完整的視頻幀,要麼包含了多個音頻幀,這一點非常重要。
我們將實現這樣一個流程:
1. 從一個.mp4文件中找到視頻流並將它找開;
2. 從視頻流中讀取包到一幀中;
3. 如果未獲取到一個完整的幀,跳轉到2
4. 把當前獲取到的完整幀保存成文件
5. 跳轉到2,直到獲取到10幀數據。
本節用到的函數主要有
(1) av_register_all():這個函數用於註冊所有編解碼器等,在舊版本的ffmpeg裏面,要在主函數中先調用這個函數,才能使用ffmpeg的其他編解碼器等模塊功能。但是在新版本的ffmpeg中,不是不需要調用的;
(2) avformat_open_input(&pAVFormatContext, argv[1], NULL, NULL):用於打開視頻文件;第一個參數是用於存放相關的文件信息,即ffmpeg打開文件後,會把相關的文件信息(如視頻流、音頻流的下標)存放到pAVFormatContext這個變量裏面。
(3) avformat_find_stream_info(pAV