1. 程式人生 > >FFmpeg獲取攝像頭資料並編碼為H.264

FFmpeg獲取攝像頭資料並編碼為H.264

       ffmpeg的視音訊編解碼功能非常強大,可以說包括了所有的視音訊編碼標準。在這裡我主要是呼叫ffmpeg工程裡的ffmpeg.exe檔案,呼叫之後,會自動完成編碼的操作。內部編碼的具體流程,以後再慢慢的看。

1.介紹

       先介紹下ffmpeg裡面的三個exe檔案。

       我們開啟ffmpeg的官網,下載時會發現有三個版本,分別是Dev、Shared、Static。Dev是開發版本,裡面包含有庫檔案(.lib)和標頭檔案(.h),但是沒有exe檔案。Shared資料夾裡面有ffmpeg.exe、ffplay.exe、ffprobe.exe,除此之外還有一些dll檔案,比如說avcodec-58.dll、avdevice-58.dll等。它的exe檔案比較小,執行時需要呼叫dll的功能。Static資料夾裡面只有三個exe,dll檔案被整合在exe裡面了,所以它的exe檔案比較大。Shared版本和Static版本可以在命令列中開啟,我們開啟系統命令列介面,切換目錄,就可以執行。

       ffmpeg.exe:用於轉碼的應用程式。舉個例子,我們把input.avi轉碼為output.h264,程式碼如下:

ffmpeg -i input.avi -b:v 640k output.ts

       內部的具體引數可以參考這裡

       ffplay.exe:用於播放的應用程式。一個簡單的播放例子:

ffplay test.avi  

       具體的使用方法和快捷鍵可以參考雷神的部落格這裡

       ffprobe.exe:用於檢視檔案格式的應用程式。

2.環境配置

        具體的環境配置可以參考這裡

3.呼叫攝像頭

       環境配置好後,我們先嚐試用ffmpeg呼叫自己的攝像頭。

       可以開啟命令列程式,跳轉到ffmpeg.exe的資料夾,輸入以下命令呼叫攝像頭。也可以利用C++的winexec()函式開啟攝像頭,程式如下。

       命令列命令:

ffplay - f dshow - i video = "HD Pro Webcam C920"

       在VS工程裡開啟攝像頭的程式碼:

#include <stdio.h>
#include <windows.h>
int main(int, char**)
{
	char* CommandVedio = "ffplay -f dshow -i video=""HD Pro Webcam C920";
    WinExec(CommandVedio, SW_SHOW);
	return 0;
}

      "HD Pro Webcam C920"是我的攝像頭名稱,如果不知道,可以用以下的命令來獲取自己的裝置稱號。

ffmpeg -list_devices true -f dshow -i dummy  

      執行後,會出現下面的結果。這裡的video devices和audio devices就是自己的視訊和音訊裝置。

       除了上面的方式外,我們也可以利用VFW讀取攝像頭的資料。

ffplay -f vfwcap -i 0  

4.編碼

       呼叫攝像頭後,將其編碼為H.264,只需要在原來的基礎上新增幾個命令即可。

ffmpeg -f dshow -i video="HD Pro Webcam C920" -vcodec libx264 mycamera.h264  

       或者這樣

ffmpeg -f vfwcap -i 0 -vcodec libx264 mycamera.h264 

       和上面一樣,如果想在VS工程裡執行,程式碼如下

#include <stdio.h>
#include <windows.h>
int main(int, char**)
{
	char* opencamera = "ffmpeg -f vfwcap -i 0 -vcodec libx264 mycamera.h264";
	//char* opencamera = "ffmpeg -f dshow -i video=""HD Pro Webcam C920"" -vcodec libx264 mycamera.h264 ";
    WinExec(opencamera, SW_SHOW);
	return 0;
}

       編碼後的h264檔案儲存在VS的工程目錄下,其實這裡不僅僅可以生成h264,也可以改為mycamera.avi/mkv等格式。

      這裡只是學會了如何呼叫ffmpeg.exe檔案進行編碼,對於內部的編碼流程,以及許多重要的函式,並沒有做太多瞭解。 ffmpeg的編碼過程其實是呼叫了libx264庫完成的,所以我們可以不需要ffmpeg的原始碼,直接呼叫libx264庫,將輸入的YUV資料編碼為h264,這也是自己接下來的學習任務。