程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> FFMPEG系列課程(一)打開視頻解碼器,ffmpeg解碼器

FFMPEG系列課程(一)打開視頻解碼器,ffmpeg解碼器

編輯:C++入門知識

FFMPEG系列課程(一)打開視頻解碼器,ffmpeg解碼器


測試環境:windows10 

開發工具:VS2013

        從今天開始准備些FFmpeg的系列教程,今天是第一課我們研究下打開視頻文件和視頻解碼器。演示環境在windows上,在Linux上代碼也是一樣。

       windows上可以不編譯ffmpeg源碼,後面我會分別講解在linux和在windows上如何編譯ffmpeg,直接在FFmpeg官網下載已經編譯好的dll和lib文件,下載地址https://ffmpeg.zeranoe.com/builds/ 裡面有32位和64位的,我下載的32位。

 

 
測試環境:windows10 
開發工具:VS2013
        從今天開始准備些FFmpeg的系列教程,今天是第一課我們研究下打開視頻文件和視頻解碼器。演示環境在windows上,在Linux上代碼也是一樣。
       windows上可以不編譯ffmpeg源碼,後面我會分別講解在linux和在windows上如何編譯ffmpeg,直接在FFmpeg官網下載已經編譯好的dll和lib文件,下載地址https://ffmpeg.zeranoe.com/builds/ 裡面有32位和64位的,我下載的32位。

//引用ffmpeg頭文件,我這邊是C++必須加上extern "C",ffmpeg都是c語言函數,
//不加會鏈接失敗,找不到定義
extern "C"
{
    #include<libavformat/avformat.h>
}
//引用lib庫,也可以在項目中設置,打開視頻只需要用到這三個庫
#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avutil.lib")
#pragma comment(lib,"avcodec.lib")
#include <iostream>
using namespace std;
int main(int argc,char *argv[])
{
    //初始化所以ffmpeg的解碼器
    av_register_all();
    
    char path[1024] = "video.mp4";
    //用來存放打開的視頻流信息
    AVFormatContext *ic = NULL;
    
    //用來存儲視頻流索引
    int videoStream = 0;
    
    //打開視頻播放流
    //path參數表示打開的視頻路徑,這個路徑可以包括各種視頻文件
    //也包括rtsp和http網絡視頻流
    //第三個參數表示傳入的視頻格式,我這邊不傳遞有FFmpeg內部獲取
    //最後一個參數是設置,我們這裡也不傳遞
    int re = avformat_open_input(&ic, path, 0, 0);
	if (re != 0)
	{
	    //獲取到FFmpeg的錯誤信息
	    char errorbuf[1024] = {0};
		av_strerror(re, errorbuf, sizeof(errorbuf));
		printf("open %s failed: %s\n", path, errorbuf);
		return -1;
	}
	
	//遍歷視頻流,裡面包含音頻流,視頻流,或者字母流,我們這裡只處理視頻
	for (int i = 0; i < ic->nb_streams; i++)
	{
		AVCodecContext *enc = ic->streams[i]->codec;
		//確認是視頻流
		if (enc->codec_type == AVMEDIA_TYPE_VIDEO)
		{
		    //存放視頻流索引,後面的代碼要用到
		    videoStream = i;
		    
		    //找到解碼器,比如H264,解碼器的信息也是ffmpeg內部獲取的
		    AVCodec *codec = avcodec_find_decoder(enc->codec_id);
		    if (!codec)
			{
				printf("video code not find!\n");
				return -2;
			}
			
		    //打開視頻解碼器,打開音頻解碼器用的也是同一個函數
			int err = avcodec_open2(enc, codec, NULL);
			if (err != 0)
			{
				char buf[1024] = { 0 };
				av_strerror(err, buf, sizeof(buf));
				printf(buf);
				return -3;
			}
		    
		    
		}
    }
}

    其他的視頻教程資料可以參考

http://edu.csdn.net/course/detail/3300

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved