欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用C語言實現(xiàn)從avi視頻中提取圖片

 更新時間:2023年10月31日 09:27:59   作者:java?樂山  
這篇文章主要為大家詳細介紹了如何使用C語言實現(xiàn)從avi視頻中提取圖片,文中的示例代碼簡潔易懂,具有一定的借鑒價值,有需要的小伙伴可以參考下

avi 視頻的視頻流編碼必須是jpeg,或者mjpg

直接用攝像頭錄取的視頻都是這兩種格式,不能用ffmpeg轉(zhuǎn)成avi的視頻。

#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>
static int zz=1;
 
int main(void){
	
	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即可
	}str;
	FILE *f=fopen("/home/wzpc/Videos/tra_mjpg.avi","rb");            //必須是JPEG,MJPG格式的avi
	if(f==NULL){
		puts("file error");
		exit(-1);
	}
	fseek(f,0,SEEK_END);
	int fsize=ftell(f);
	fseek(f,0,SEEK_SET);
	
	int fd=fileno(f);
	char *m=mmap(NULL,fsize,PROT_READ,MAP_SHARED,fd,0);
	
	
	
	for(int t=0;t<fsize;t++){
		if((m[t]=='s')&&(m[t+1]=='t')&&(m[t+2]=='r')&&(m[t+3]=='f')){
			
			memcpy(&str,&m[t],sizeof(str));
			printf("%d\n",str.bitcount);
			printf("%s\n",str.compression);
			printf("%d*%d\n",str.width,str.height);
			
			char r[]={'M','J','P','G'};                 //avi 編碼必須是jpeg,mjpg
			char r1[]={'J','P','E','G'};
			int bj=memcmp(str.compression,r,4);
			int bj1=memcmp(str.compression,r1,4);
            if((bj==0)||(bj1==0))
			{
			   zz=0;
			}
		    
		}
	}
	
	if(zz!=0){
		puts("no zc");
		exit(-1);
	}
	
	for(int t=0;t<fsize;t++){
		if((m[t]=='0')&&(m[t+1]=='0')&&(m[t+2]=='d')&&(m[t+3]=='c')){
		    char file[10]={};
			sprintf(file,"%d",t);
			
			chdir("/home/wzpc/Pictures/pic_avi");    //存儲圖片的目錄
			FILE * fo=fopen(file,"w+b");
			if(fo==NULL){
				puts("fo error");
				exit(-1);
			}
			
			int k;
			memcpy(&k,&m[t+4],4);
			fwrite(&m[t+8],k,1,fo);                //直接從mmap中讀數(shù)據(jù)到文件
			fclose(fo);
		
		}
  }
	
	munmap(m,fsize);
	return 0;
}

知識補充

除了上文的方法,小編還為大家整理了C語言讀取視頻關(guān)鍵幀并保存成圖片的方法,希望對大家有所幫助

#include<opencv2\opencv.hpp>
#include <iostream>
#include <stdio.h>
#include<fstream>
using namespace std;
using namespace cv;
int main()
{
    //打開視頻文件:其實就是建立一個VideoCapture結(jié)構(gòu)
    VideoCapture capture("D:/MyData/zhaohz4/Desktop/Nansha_video/2.mp4");
    //檢測是否正常打開:成功打開時,isOpened返回ture
    if (!capture.isOpened())
        cout << "fail toopen!" << endl;
    //獲取整個幀數(shù)
    long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);
    cout << "整個視頻共" << totalFrameNumber << "幀" << endl;
    //設(shè)置開始幀()
    long frameToStart = 1;
    capture.set(CV_CAP_PROP_POS_FRAMES, frameToStart);
    cout << "從第" << frameToStart << "幀開始讀" << endl;
    //設(shè)置結(jié)束幀
    int frameToStop = 4000;
    if (frameToStop < frameToStart)
    {
        cout << "結(jié)束幀小于開始幀,程序錯誤,即將退出!" << endl;
        return -1;
    }
    else
    {
        cout << "結(jié)束幀為:第" << frameToStop << "幀" << endl;
    }
    //獲取幀率
    double rate = capture.get(CV_CAP_PROP_FPS);
    cout << "幀率為:" << rate << endl;
    //定義一個用來控制讀取視頻循環(huán)結(jié)束的變量
    bool stop = false;
    //承載每一幀的圖像
    Mat frame;
    //顯示每一幀的窗口
    namedWindow("Extractedframe");
    //兩幀間的間隔時間:
    //int delay = 1000/rate;
    double delay = 2000 / rate;     //??
    //利用while循環(huán)讀取幀
    //currentFrame是在循環(huán)體中控制讀取到指定的幀后循環(huán)結(jié)束的變量
    long currentFrame = frameToStart;
    //濾波器的核
    int kernel_size = 3;
    Mat kernel = Mat::ones(kernel_size, kernel_size, CV_32F) / (float)(kernel_size*kernel_size);
    while (!stop)
    {
        //讀取下一幀
        if (!capture.read(frame))
        {
            cout << "讀取視頻失敗" << endl;
            return -1;
        }
        if (currentFrame % 3 == 0)    //每三幀保存一幀
        {
            cout << "正在讀取第" << currentFrame << "幀" << endl;
            imshow("Extractedframe", frame);
            cout << "正在寫第" << currentFrame << "幀" << endl;
            stringstream str;
            str << "2-"<<currentFrame << ".jpg";     //保存格式
            cout << str.str() << endl;
            imwrite(str.str(), frame);
        }
        //waitKey(intdelay=0)當delay≤ 0時會永遠等待;當delay>0時會等待delay毫秒
        //當時間結(jié)束前沒有按鍵按下時,返回值為-1;否則返回按鍵
        //int c = waitKey(delay);
        int c = waitKey(1000);
        //按下ESC或者到達指定的結(jié)束幀后退出讀取視頻
        if ((char)c == 27 || currentFrame > frameToStop)
        {
            stop = true;
        }
        //按下按鍵后會停留在當前幀,等待下一次按鍵
        if (c >= 0)
        {
            waitKey(0);
        }
        currentFrame++;
    }
    //關(guān)閉視頻文件
    capture.release();
    waitKey(0);
    return 0;
}

到此這篇關(guān)于使用C語言實現(xiàn)從avi視頻中提取圖片的文章就介紹到這了,更多相關(guān)C語言視頻提取圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ socket實現(xiàn)miniFTP

    C++ socket實現(xiàn)miniFTP

    這篇文章主要為大家詳細介紹了C++ socket實現(xiàn)miniFTP的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • C語言遞歸實現(xiàn)掃雷游戲

    C語言遞歸實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細介紹了C語言遞歸實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 使用C語言繪制統(tǒng)計圖中的餅圖

    使用C語言繪制統(tǒng)計圖中的餅圖

    常用的統(tǒng)計圖有條形圖、柱形圖、折線圖、曲線圖、餅圖、環(huán)形圖、扇形圖,本文主要為大家詳細介紹了如何使用使用C語言繪制統(tǒng)計圖中的餅圖,希望對大家有所幫助
    2024-02-02
  • 判斷一個無向圖是否為連通圖的方法

    判斷一個無向圖是否為連通圖的方法

    今天小編就為大家分享一篇關(guān)于判斷一個無向圖是否為連通圖的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • C++中對象的動態(tài)建立與釋放詳解及其作用介紹

    C++中對象的動態(tài)建立與釋放詳解及其作用介紹

    這篇文章主要介紹了C++中對象的動態(tài)建立與釋放詳解及其作用介紹,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C語言中if語句加大括號和不加大括號的區(qū)別介紹

    C語言中if語句加大括號和不加大括號的區(qū)別介紹

    這篇文章主要給大家介紹了關(guān)于C語言中if語句加大括號和不加大括號的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 理解數(shù)據(jù)結(jié)構(gòu)

    理解數(shù)據(jù)結(jié)構(gòu)

    本文是對數(shù)據(jù)結(jié)構(gòu)對編程的重要性,數(shù)據(jù)結(jié)構(gòu)對數(shù)據(jù)存儲,數(shù)據(jù)處理,內(nèi)存工作,從宏觀上理解數(shù)據(jù)結(jié)構(gòu)
    2016-07-07
  • 詳解C語言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實現(xiàn)

    詳解C語言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實現(xiàn)

    這篇文章主要介紹了C語言中字符串拷貝函數(shù)(strcpy)與內(nèi)存拷貝函數(shù)(memcpy)的不同及內(nèi)存拷貝函數(shù)的模擬實現(xiàn),感興趣的小伙伴可以跟隨小編一起學習一下
    2022-12-12
  • C語言各種操作符透徹理解下篇

    C語言各種操作符透徹理解下篇

    C?語言提供了豐富的操作符,除了上篇中的算術(shù)操作符,移位操作符,位操作符,賦值操作符外,還有單目操作符、關(guān)系操作符、邏輯操作符、條件操作符等等,讓我們通讀本篇來詳細了解吧
    2022-02-02
  • 基于QT設(shè)計一個春聯(lián)自動生成器

    基于QT設(shè)計一個春聯(lián)自動生成器

    春節(jié)是中國最隆重的傳統(tǒng)節(jié)日,一到過年家家戶戶肯定是要貼春聯(lián);在春節(jié)前夕,會用大紅紙張,加上濃墨書寫祝福詞語。本文將利用Qt框架設(shè)計一個春聯(lián)自動生成器,需要的可以參考一下
    2022-01-01

最新評論