ffmpeg從USB攝像頭采集一張原始圖片(轉)


本文講解使用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文件,編寫測試代碼,本文測試代碼如下,代碼比較簡單,沒做相應的錯誤檢測等操作:

   

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. /*  
  2.  *FileName:avcodec.cpp  
  3.  *Author:yingxianFei  
  4.  *Description:capture one frame data from usb camera and save into file named out.yuv .  
  5.  **/  
  6.   
  7. #include <iostream>  
  8.   
  9. using namespace std;  
  10.   
  11. extern "C" {  
  12. #include <math.h>  
  13. #include <libavutil/opt.h>  
  14. #include <libavcodec/avcodec.h>  
  15. #include <libavutil/channel_layout.h>  
  16. #include <libavutil/common.h>  
  17. #include <libavutil/imgutils.h>  
  18. #include <libavutil/mathematics.h>  
  19. #include <libavutil/samplefmt.h>  
  20. #include <libavformat/avformat.h>  
  21. #include <libavdevice/avdevice.h>  
  22. #include <libavutil/dict.h>  
  23. };  
  24.   
  25.   
  26. int main(int argc, char **argv) {  
  27.     int ret;  
  28.     AVFormatContext *fmtCtx = NULL;  
  29.     AVPacket pkt1, *pcaket = &pkt1;  
  30.   
  31.     /*1、注冊*/  
  32.     avcodec_register_all();  
  33.     avdevice_register_all();  
  34.     /*2、連接視頻源*/  
  35.     AVInputFormat *inputFmt = av_find_input_format("video4linux2");  
  36.     if (NULL != inputFmt) {  
  37.         std::cout << "input device name:" <inputFmt->name <std::endl;  
  38.     } else {  
  39.         std::cout << "Null point!" <std::endl;  
  40.     }  
  41.     /*3、打開視頻采集設備*/  
  42.     ret = avformat_open_input(&fmtCtx, "/dev/video0", inputFmt, NULL);  
  43.     if (0 == ret) {  
  44.         std::cout << "Open input device seccess!" <std::endl;  
  45.     }  
  46.     /*4、讀取一幀數據,編碼依據攝像頭類型而定,我使用的攝像頭輸出的是yuv422格式*/  
  47.     av_read_frame(fmtCtx, pcaket);  
  48.     std::cout << "packet size:" << (pcaket->size) <std::endl;  
  49.     /*5、寫入幀數據到文件*/  
  50.     FILE *fp = NULL;  
  51.     fp = fopen("out.yuv", "wb");  
  52.     if (NULL != fp) {  
  53.         //將數據寫入文件  
  54.         fwrite(pcaket->data, 1, pcaket->size, fp);  
  55.     }  
  56.     //關閉文件  
  57.     fclose(fp);  
  58.     /*6、釋放讀取的幀數據*/  
  59.     av_free_packet(pcaket);  
  60.     /*7、關閉視頻輸入源*/  
  61.     avformat_close_input(&fmtCtx);  
  62.   
  63.     return 0;  
  64. }  

 

 

3、編譯測試

     編譯工程,將生成的源文件nfs到開發板上,運行可執行文件,成功后將保存一幀數據到out.yuv文件中。

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM