国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

c 攝像頭利用v4l2直接生成avi視頻(不利用ffmpeg)

這篇具有很好參考價值的文章主要介紹了c 攝像頭利用v4l2直接生成avi視頻(不利用ffmpeg)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

自定義avi結(jié)構(gòu)頭文件?,F(xiàn)在不能實時顯示攝像頭畫面,準備參照fim(終端中顯示圖片),直接對顯示framebuffer操作,顯示視頻。不用qt等。

生成的視頻根據(jù)機子的性能不同,詁計要手動調(diào)一下生成視頻的幀率。

播放: $ aplay ?musicdemo.wmv

錄音: $ arecord -c 2 -r 44100 -f S16_LE musicdemo.wmv

調(diào)節(jié)音量大小: $ alsamixer?

deepin安裝 alsa-lib

sudo apt-get install libasound2-dev ??

main.c


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#include <string.h>
#include <sys/mman.h>
#include "Avi.h"

 

int main(void){
	int fd = open("/dev/video0", O_RDWR);
	if(fd < 0)
	{
		perror("打開設(shè)備失敗");
		return -1;
	}
	struct v4l2_format vfmt;
	vfmt.type=1;
	vfmt.fmt.pix.width=1680;         
	vfmt.fmt.pix.height=1080;
	vfmt.fmt.pix.pixelformat=V4L2_PIX_FMT_MJPEG; 
	int ret = ioctl(fd, VIDIOC_S_FMT, &vfmt);
	if(ret < 0)
	{
		perror("設(shè)置格式失敗");
	}
	
	struct v4l2_requestbuffers reqbuffer;
	reqbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	reqbuffer.count = 1; 
	reqbuffer.memory = V4L2_MEMORY_MMAP ;
	ret  = ioctl(fd, VIDIOC_REQBUFS, &reqbuffer);
	if(ret < 0)
	{
		perror("申請隊列空間失敗");
	}
	
	struct v4l2_buffer mapbuffer;
	unsigned char *mptr;
	unsigned int  size;
	mapbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	mapbuffer.index = 0;
	
	ret = ioctl(fd, VIDIOC_QUERYBUF, &mapbuffer);//查詢緩沖區(qū)狀態(tài)
	if(ret < 0)
	{
		perror("查詢內(nèi)核空間隊列失敗");
	}
	
	int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	ret = ioctl(fd, VIDIOC_STREAMON, &type);     //啟動流
	if(ret < 0)
	{
		perror("開啟失敗");
	}
	
	mptr= (unsigned char *)mmap(NULL, mapbuffer.length, PROT_READ|PROT_WRITE, 
		MAP_SHARED, fd,0);       //設(shè)備映射到緩沖區(qū)內(nèi)存
	size=mapbuffer.length;
	
	ret  = ioctl(fd, VIDIOC_QBUF, &mapbuffer);    //把緩沖區(qū)數(shù)據(jù)放入讀隊列中
	if(ret < 0)                                   
	{
		perror("放回失敗");
	}
//---------------------------------------------------------------------------
    FILE *file=avi_ks();
	
	while(nframes<100){
	ret = ioctl(fd, VIDIOC_DQBUF, &mapbuffer);       //讀當前隊列緩沖區(qū)的數(shù)據(jù)
	if(ret < 0)
	{
		perror("提取數(shù)據(jù)失敗");
	}
	int size=1280*720;
	unsigned char tmp[4] = {'0', '0', 'd', 'c'};  //00dc = 壓縮的視頻數(shù)據(jù)
	fwrite(tmp, 4, 1, file);    //寫入是否是壓縮的視頻數(shù)據(jù)信息
	fwrite(&size, 4, 1, file);   //寫入4字節(jié)對齊后的JPEG圖像大小
	fwrite(mptr,size, 1, file); //寫入真正的JPEG數(shù)據(jù)
		
	ret  = ioctl(fd, VIDIOC_QBUF, &mapbuffer);    //把緩沖區(qū)數(shù)據(jù)放入讀隊列中
	if(ret < 0)                                   
	{
		perror("放回失敗");
	}
	 nframes++;           
     totalsize++;         

	}
	
//---------------------------------------------------------
	ret = ioctl(fd, VIDIOC_STREAMOFF, &type);
	
	avi_end(file);
	
	munmap(mptr, size);
	
	close(fd);
	
	return 0;
}

avi.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <malloc.h>
#include <wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include "Avi.h"




FILE * avi_ks(void){	

	FILE *fp= fopen("sample.avi","wb");

	fseek(fp,sizeof(HEAD),SEEK_SET);

	return fp;
}
	
	//--------------------------------------------------------
 int avi_add(FILE*fp,char *data,int size){
	
			unsigned char tmp[4] = {'0', '0', 'd', 'c'};  //00dc = 壓縮的視頻數(shù)據(jù)
			fwrite(tmp, 4, 1, fp);    //寫入是否是壓縮的視頻數(shù)據(jù)信息
			fwrite(&size, 4, 1, fp);   //寫入4字節(jié)對齊后的JPEG圖像大小
			fwrite(data,size, 1, fp); //寫入真正的JPEG數(shù)據(jù)
			return 0;
	}
 
 //----------------------------------------------------------------------------------
 int avi_end(FILE *f_file){
	 
	int width=1280;
	int height=720;
	
	
	typedef  struct hdrl AVI_HDRL_LIST;
	typedef  struct movi AVI_LIST_HEAD;
	typedef  struct avih AVI_AVIH_CHUNK;
	typedef  struct strl AVI_STRL_LIST;
	typedef  struct strh  AVI_STRH_CHUNK;
	typedef  struct strf  AVI_STRF_CHUNK;
	typedef  struct  avi   AVI_HEAD;
	
	AVI_HEAD  avi_head={ 
		
		{
			{'R', 'I', 'F', 'F'},
			4 + sizeof(AVI_HDRL_LIST) + sizeof(AVI_LIST_HEAD) +nframes * 8 + totalsize,
			{'A', 'V', 'I', ' '}
		},
		
		{
			{'L', 'I', 'S', 'T'},
			sizeof(AVI_HDRL_LIST) - 8,
			{'h', 'd', 'r', 'l'},
			{
				{'a', 'v', 'i', 'h'},
				sizeof(AVI_AVIH_CHUNK) - 8,
				1000000, 25000, 0, 0,nframes, 0, 1, 1000000, width, height,
				{0, 0, 0, 0}
			},
			{
				{'L', 'I', 'S', 'T'},
				sizeof(AVI_STRL_LIST) - 8,
				{'s', 't', 'r', 'l'},
				{
					{'s', 't', 'r', 'h'},
					sizeof(AVI_STRH_CHUNK) - 8,
					{'v', 'i', 'd', 's'},
					{'J', 'P', 'E', 'G'},
					0, 0, 0, 0, 1, 15, 0, nframes, 100000, 0xFFFFFF, 0,
					{0, 0, width, height}
				},
				{
					{'s', 't', 'r', 'f'},
					sizeof(AVI_STRF_CHUNK) - 8,
					sizeof(AVI_STRF_CHUNK) - 8,
					width, height, 1, 24,
					{'J', 'P', 'E', 'G'},
					width * height * 3, 0, 0, 0, 0
				}
			}
			
		},
		
		{
			{'L', 'I', 'S', 'T'},
			4 + nframes * 8 + totalsize,
			{'m', 'o', 'v', 'i'}
		}
	};
	
	
	fseek(f_file, 0, SEEK_SET);
	
	fwrite(&avi_head,sizeof(HEAD),1,f_file);
	
	fclose(f_file);
	printf("end\n");
 }
 


avi.h文章來源地址http://www.zghlxwxcb.cn/news/detail-721703.html


#ifndef AVI_H
#define AVI_H
#include <stdio.h>
static int nframes;           //總幀數(shù)
static int totalsize; 
FILE * avi_ks(void);
int avi_add(FILE*fp,char *data,int size);
int avi_end(FILE *f_file);

struct avi{
	struct riff{
		unsigned char id[4];
		unsigned int size;
		unsigned char type[4];
	}r1;
	
	
	struct hdrl{
		unsigned char id[4];    //塊ID,固定為LIST
		unsigned int size;      //塊大小,等于struct avi_hdrl_list去掉id和size的大小
		unsigned char type[4];  //塊類型,固定為hdrl
		
		struct avih{
			unsigned char id[4];            //塊ID,固定為avih
			unsigned int size;              //塊大小,等于struct avi_avih_chunk去掉id和size的大小
			unsigned int us_per_frame;      //視頻幀間隔時間(以微秒為單位)
			unsigned int max_bytes_per_sec; //AVI文件的最大數(shù)據(jù)率
			unsigned int padding;           //設(shè)為0即可
			unsigned int flags;             //AVI文件全局屬性,如是否含有索引塊、音視頻數(shù)據(jù)是否交叉存儲等
			unsigned int total_frames;      //總幀數(shù)
			unsigned int init_frames;       //為交互格式指定初始幀數(shù)(非交互格式應(yīng)該指定為0)
			unsigned int streams;           //文件包含的流的個數(shù),僅有視頻流時為1
			unsigned int suggest_buff_size; //指定讀取本文件建議使用的緩沖區(qū)大小,通常為存儲一楨圖像                                            //以及同步聲音所需的數(shù)據(jù)之和,不指定時設(shè)為0
			unsigned int width;             //視頻主窗口寬度(單位:像素)
			unsigned int height;            //視頻主窗口高度(單位:像素)
			unsigned int reserved[4];       //保留段,設(shè)為0即可
		}a1;
		
		struct   strl{
			unsigned char id[4];    //塊ID,固定為LIST
			unsigned int size;      //塊大小,等于struct avi_strl_list去掉id和size的大小
			unsigned char type[4];  //塊類型,固定為strl
			
			struct strh{
				unsigned char id[4];            //塊ID,固定為strh
				unsigned int size;              //塊大小,等于struct avi_strh_chunk去掉id和size的大小
				unsigned char stream_type[4];   //流的類型,vids表示視頻流,auds表示音頻流
				unsigned char codec[4];         //指定處理這個流需要的解碼器,如JPEG
				unsigned int flags;             //標記,如是否允許這個流輸出、調(diào)色板是否變化等,一般設(shè)為0即可
				unsigned short priority;        //流的優(yōu)先級,視頻流設(shè)為0即可
				unsigned short language;        //音頻語言代號,視頻流設(shè)為0即可
				unsigned int init_frames;       //為交互格式指定初始幀數(shù)(非交互格式應(yīng)該指定為0)
				unsigned int scale;             //
				unsigned int rate;              //對于視頻流,rate / scale = 幀率fps
				unsigned int start;             //對于視頻流,設(shè)為0即可
				unsigned int length;            //對于視頻流,length即總幀數(shù)
				unsigned int suggest_buff_size; //讀取這個流數(shù)據(jù)建議使用的緩沖區(qū)大小
				unsigned int quality;           //流數(shù)據(jù)的質(zhì)量指標
				unsigned int sample_size;       //音頻采樣大小,視頻流設(shè)為0即可
				struct rcFrame{                 //這個流在視頻主窗口中的顯示位置,設(shè)為{0,0,width,height}即可
					
					short left;
					short top;
					short right;
					short bottom;
				} AVI_RECT_FRAME;      
			}s1;
			
			struct strf{
				unsigned char id[4];             //塊ID,固定為strf
				unsigned int size;               //塊大小,等于struct avi_strf_chunk去掉id和size的大小
				unsigned int size1;              //size1含義和值同size一樣
				unsigned int width;              //視頻主窗口寬度(單位:像素)
				unsigned int height;             //視頻主窗口高度(單位:像素)
				unsigned short planes;           //始終為1
				unsigned short bitcount;         //每個像素占的位數(shù),只能是1、4、8、16、24和32中的一個
				unsigned char compression[4];    //視頻流編碼格式,如JPEG、MJPG等
				unsigned int image_size;         //視頻圖像大小,等于width * height * bitcount / 8
				unsigned int x_pixels_per_meter; //顯示設(shè)備的水平分辨率,設(shè)為0即可
				unsigned int y_pixels_per_meter; //顯示設(shè)備的垂直分辨率,設(shè)為0即可
				unsigned int num_colors;         //含義不清楚,設(shè)為0即可
				unsigned int imp_colors;         //含義不清楚,設(shè)為0即可
			}q1;
			
		}w1;
		
	}a1;
	
	struct movi{
		unsigned char id[4];
		unsigned int size;
		unsigned char type[4];
	}movi1;
	
}HEAD;

#endif

到了這里,關(guān)于c 攝像頭利用v4l2直接生成avi視頻(不利用ffmpeg)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Ubuntu下python-opencv無法打開攝像頭,open VIDEOIO(V4L2:/dev/video0): can‘t open camera by index

    Ubuntu下python-opencv無法打開攝像頭,open VIDEOIO(V4L2:/dev/video0): can‘t open camera by index

    我們在ubuntu下使用opencv獲取攝像頭畫面是,報錯 open VIDEOIO(V4L2:/dev/video0): can‘t open camera by index 然后觀察虛擬機桌面的右下角,如果出現(xiàn)攝像頭有小綠點表示連接成功 然后我們來測試一下,攝像頭的畫面 ####### 這是攝像頭傳輸回來的畫面

    2024年02月16日
    瀏覽(52)
  • RK3568 android11 移植 v4l2loopback 虛擬攝像頭

    RK3568 android11 移植 v4l2loopback 虛擬攝像頭

    v4l2loopback是一個Linux內(nèi)核模塊,它允許用戶創(chuàng)建虛擬視頻設(shè)備。這種虛擬視頻設(shè)備可以用于各種用途,例如將實際攝像頭的視頻流復(fù)制到虛擬設(shè)備上,或者用于視頻流的處理和分析等。v4l2loopback的主要作用是 創(chuàng)建一個虛擬的Video4Linux2設(shè)備,它可以接收來自其他應(yīng)用程序的視頻

    2024年01月19日
    瀏覽(25)
  • V4L2常用調(diào)試命令

    這篇文章簡單記錄一下RK平臺基于V4L2框架camera調(diào)試過程中常用的一些命令: (1)查看拓撲結(jié)構(gòu):查看media0的pipeline (2)抓數(shù)據(jù)流命令: 對video0節(jié)點,設(shè)置格式為NV12,分辨率為1920x1080,不裁剪,4個buf輪轉(zhuǎn),--verbose的作用是刷出幀率。 (3)抓圖命令: 類似上面的,將圖像保

    2024年02月03日
    瀏覽(19)
  • Linux之V4L2驅(qū)動框架

    Linux之V4L2驅(qū)動框架

    目錄 一、V4L2簡介 二、V4L2操作流程 ?1.打開攝像頭 2.查詢設(shè)備的屬性/能力/功能 3.獲取攝像頭支持的格式 4.設(shè)置攝像頭的采集通道 5.設(shè)置/獲取攝像頭的采集格式和參數(shù) 6.申請幀緩沖、內(nèi)存映射、入隊 (1)申請幀緩沖 (2)內(nèi)存映射 (3)入隊 7.開啟視頻采集 8.讀取數(shù)據(jù)、對數(shù)

    2024年02月08日
    瀏覽(20)
  • V4L2+QT+USB攝像頭實時顯示視頻(Arm,Linux,window均適用)

    V4L2+QT+USB攝像頭實時顯示視頻(Arm,Linux,window均適用)

    筆者自從學習了Framebuffer編程和V4L2編程之后,就想實現(xiàn)在LCD屏上顯示實時視頻 筆者學習過正點I.MX6U Linux C編程中的相關(guān)內(nèi)容,然而原子的例程是針對OV5640攝像頭寫的,像素格式是RGB 然而USB攝像頭大多支持MJPEG或者YUYV格式,如果要在屏幕上顯示需要進行格式轉(zhuǎn)換,而 轉(zhuǎn)換像素

    2023年04月08日
    瀏覽(25)
  • 項目之利用 V4L2應(yīng)用程序框架 進行視頻錄制

    目錄 知識儲備: 視頻采集方式: 處理采集數(shù)據(jù): 相關(guān)結(jié)構(gòu)體: 對于設(shè)備的操作步驟: ????????V4L2較V4L有較大的改動,并已成為 2.6 的標準接口,函蓋 videodvbFM... ,多數(shù)驅(qū)動都在向 V4l2 遷移。更好地了解 V4L2 先從應(yīng)用入手,然后再深入到內(nèi)核中結(jié)合物理設(shè)備/接口的規(guī)范實現(xiàn)

    2023年04月09日
    瀏覽(18)
  • 汽車IVI中控開發(fā)入門及進階(十二):V4L2視頻

    前言 ? ? IVI,In-Vehicle Infotainment,智能座艙信息娛樂系統(tǒng),或稱車載信息娛樂系統(tǒng), 汽車中控也被稱為車機、車載多媒體、車載娛樂等, 它是智能座艙的重要組成部分。IVI 采用車載專用中央處理器,基于車身總線系統(tǒng)和聯(lián)網(wǎng)服務(wù)提供車載綜合信息處理功能,包括音頻播放、

    2024年02月04日
    瀏覽(21)
  • 【C++】開源:Linux端V4L2視頻設(shè)備庫

    【C++】開源:Linux端V4L2視頻設(shè)備庫

    ?? ★,° :.☆( ̄▽ ̄)/$: .°★ ?? 這篇文章主要介紹Linux端V4L2視頻設(shè)備庫。 無專精則不能成,無涉獵則不能通。——梁啟超 歡迎來到我的博客,一起學習,共同進步。 喜歡的朋友可以關(guān)注一下,下次更新不迷路?? Video4Linux2( V4L2 )是一個用于Linux操作系統(tǒng)的視頻設(shè)備驅(qū)動框

    2024年02月11日
    瀏覽(21)
  • 內(nèi)存不足V4L2 申請DMC緩存報錯問題

    當內(nèi)存不足時,V4L2可能存在申請DMA緩存報錯,如下日志:

    2024年02月12日
    瀏覽(17)
  • RK3568平臺開發(fā)系列講解(驅(qū)動基礎(chǔ)篇)V4L2 用戶空間 API 說明

    RK3568平臺開發(fā)系列講解(驅(qū)動基礎(chǔ)篇)V4L2 用戶空間 API 說明

    ??返回專欄總目錄 沉淀、分享、成長,讓自己和他人都能有所收獲!?? ??設(shè)備驅(qū)動的主要目的是控制和利用底層硬件,同時向用戶展示功能。 這些用戶可以是在用戶空間或其他內(nèi)核驅(qū)動中運行的應(yīng)用。 本篇我們將學習如何利用內(nèi)核公開的 V4L2 設(shè)備功能。 我們將從描述和

    2023年04月25日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包