庫的分支:
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