天天看點

01 ffmpeg對攝像頭的調用程式設計

庫的分支:
  libavcodec  // audio video codec 音視訊的編解碼庫  
  libavformat  //  與容器相關的操作. 檔案的格式
  libswscale    // 轉換資料格式
  libavdevice   // 操作如攝像頭,聲霸卡裝置檔案的庫 
  libavfilter   // 可加水印
           
頭檔案:

#define __STDC_CONSTANT_MACROS
extern "C" {
    #include <libavcodec/avcodec.h>
    #include <libavformat/avformat.h>
    #include <libavdevice/avdevice.h>
}
           
AVInputFormat類型表示一種輸入檔案/輸入裝置的資料格式
AVFormatContext類型表示音視訊的格式内容
AVDictionary類型表示相關的配置項,如攝像頭裝置有圖像大小的配置 
AVPacket類型用于裝載一幀資料
           
av_register_all();         //注冊能用的編解碼器及檔案格式

     avdevice_register_all();   //注冊能操作的輸入輸出裝置


     準備參數
       AVInputFormat *ifmt = av_find_input_format("v4l2"); ///指定要擷取視訊輸入裝置
           AVFormatContext *fmtContxt = avformat_alloc_context();
           AVDictionary *options = NULL;

       av_dict_set(&options, "video_size", "640x480", ); //設定攝像頭的圖像大小
        //攝像頭可配置的選項,可參考ffmpeg源碼/libavdevice/v4l2.c              

     使用指定的參數, 打開指定的裝置
        if (avformat_open_input(&fmtContxt, "/dev/video0", ifmt, &options) < )
        {
        perror("avformat open");
        return ;
        }

     打開裝置後, 可檢查攝像頭的圖像格式及分辨率.
        AVCodecID id = fmtContxt->streams[]->codec->codec_id; //擷取資料的格式ID
        qDebug() << id << "   " << avcodec_get_name(id);  
        // usb攝像頭有兩種, mjpeg和rawvideo(yuyv422)

        qDebug() << fmtContxt->streams[]->codec->width;
        qDebug() << fmtContxt->streams[]->codec->height;

     準備一幀資料的空間,及讀取資料: 
        AVPacket *packet = (AVPacket *)av_malloc(sizeof(AVPacket));

        av_read_frame(fmtContxt, packet); //讀取一幀資料
        // packet->data指針指向圖像資料緩沖區的首位址
        // packet->size是圖像資料的真實大小

        // 如果圖像格式是mjpeg,則把資料存成檔案,就是一張jpg圖像了
        // 如果是rawvideo,  則資料是一張圖像的yuyv資料.
           

pro檔案:

參考:
    http://my.csdn.net/leixiaohua1020