FFmpeg獲取攝像頭資料並編碼為H.264
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,這也是自己接下來的學習任務。