本文講解使用ffmpeg從USB攝像頭中采集一幀數據並寫入文件保存,測試平台使用全志A20平台,其他平台修改交叉工具鏈即可移植。開發環境使用eclipse+CDT。交叉工具鏈使用arm-Linux-gcc4.4版本。
ffmpeg庫的移植和編譯請參考博客http://blog.csdn.net/smilefyx/article/details/32714743,開發板usb攝像頭支持配置請參照博客http://blog.csdn.net/smilefyx/article/details/29574783。轉載請聲明。
1、工程建立
使用eclipse建立一個空的C++工程,工程目錄請參照http://blog.csdn.net/smilefyx/article/details/32714743博文。工程建立后在編譯選項中加入-D__STDC_CONSTANT_MACROS,否則會報一個錯,可以自己嘗試。

2、編寫源代碼
打開剛才創建工程時創建的avcodec.cpp文件,編寫測試代碼,本文測試代碼如下,代碼比較簡單,沒做相應的錯誤檢測等操作:
- /*
- *FileName:avcodec.cpp
- *Author:yingxianFei
- *Description:capture one frame data from usb camera and save into file named out.yuv .
- **/
- #include <iostream>
- using namespace std;
- extern "C" {
- #include <math.h>
- #include <libavutil/opt.h>
- #include <libavcodec/avcodec.h>
- #include <libavutil/channel_layout.h>
- #include <libavutil/common.h>
- #include <libavutil/imgutils.h>
- #include <libavutil/mathematics.h>
- #include <libavutil/samplefmt.h>
- #include <libavformat/avformat.h>
- #include <libavdevice/avdevice.h>
- #include <libavutil/dict.h>
- };
- int main(int argc, char **argv) {
- int ret;
- AVFormatContext *fmtCtx = NULL;
- AVPacket pkt1, *pcaket = &pkt1;
- /*1、注冊*/
- avcodec_register_all();
- avdevice_register_all();
- /*2、連接視頻源*/
- AVInputFormat *inputFmt = av_find_input_format("video4linux2");
- if (NULL != inputFmt) {
- std::cout << "input device name:" << inputFmt->name << std::endl;
- } else {
- std::cout << "Null point!" << std::endl;
- }
- /*3、打開視頻采集設備*/
- ret = avformat_open_input(&fmtCtx, "/dev/video0", inputFmt, NULL);
- if (0 == ret) {
- std::cout << "Open input device seccess!" << std::endl;
- }
- /*4、讀取一幀數據,編碼依據攝像頭類型而定,我使用的攝像頭輸出的是yuv422格式*/
- av_read_frame(fmtCtx, pcaket);
- std::cout << "packet size:" << (pcaket->size) << std::endl;
- /*5、寫入幀數據到文件*/
- FILE *fp = NULL;
- fp = fopen("out.yuv", "wb");
- if (NULL != fp) {
- //將數據寫入文件
- fwrite(pcaket->data, 1, pcaket->size, fp);
- }
- //關閉文件
- fclose(fp);
- /*6、釋放讀取的幀數據*/
- av_free_packet(pcaket);
- /*7、關閉視頻輸入源*/
- avformat_close_input(&fmtCtx);
- return 0;
- }
3、編譯測試
編譯工程,將生成的源文件nfs到開發板上,運行可執行文件,成功后將保存一幀數據到out.yuv文件中。

使用Pyuv工具可以打開文件查看文件內容,打開時按照自己攝像頭的參數進行選項配置,如本文測試效果如下:

http://blog.csdn.net/smilefyx/article/details/33728881
