当前位置: 首页 > news >正文

c 从avi 视频中提取图片

avi 视频的视频流编码必须是jpeg,或者mjpg

直接用摄像头录取的视频都是这两种格式,不能用ffmpeg转成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,固定为strfunsigned int size;               //块大小,等于struct avi_strf_chunk去掉id和size的大小unsigned int size1;              //size1含义和值同size一样unsigned int width;              //视频主窗口宽度(单位:像素)unsigned int height;             //视频主窗口高度(单位:像素)unsigned short planes;           //始终为1unsigned short bitcount;         //每个像素占的位数,只能是1、4、8、16、24和32中的一个unsigned char compression[4];    //视频流编码格式,如JPEG、MJPG等unsigned int image_size;         //视频图像大小,等于width * height * bitcount / 8unsigned int x_pixels_per_meter; //显示设备的水平分辨率,设为0即可unsigned int y_pixels_per_meter; //显示设备的垂直分辨率,设为0即可unsigned int num_colors;         //含义不清楚,设为0即可unsigned int imp_colors;         //含义不清楚,设为0即可}str;FILE *f=fopen("/home/wzpc/Videos/tra_mjpg.avi","rb");            //必须是JPEG,MJPG格式的aviif(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,mjpgchar 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中读数据到文件fclose(fo);}}munmap(m,fsize);return 0;
}

 

 

http://www.lryc.cn/news/212118.html

相关文章:

  • Jtti:Apache服务的反向代理及负载均衡怎么配置
  • 82.二分查找
  • 线程是如何创建的
  • owl_vit安装步骤
  • 运行real.exe时出现NUM_METGRID_SOIL_LEVELS=0
  • 【数值计算方法】Gauss消元法及其Python/C实现
  • ins老被封禁?快来看看这些雷区你踩了没!
  • 《Effective Java》读书笔记(1-2章)
  • C++版split(‘_‘)函数
  • Leaky singletons的一种使用场景
  • TensorFlow图像多标签分类实例
  • Python程序设计期末复习笔记
  • 人大与加拿大女王大学金融硕士—与您共创辉煌
  • Generalized Zero-Shot Learning With Multi-Channel Gaussian Mixture VAE
  • 10.30 知识总结(标签分类、css介绍等)
  • DoLa:对比层解码提高大型语言模型的事实性
  • 解决由于找不到mfc140u.dll无法继续执行此代码问题的4个方法
  • MySQL高性能优化规范建议
  • pytorch 入门 (五)案例三:乳腺癌识别-VGG16实现
  • vue中electron与vue通信(fs.existsSync is not a function解决方案)
  • LSTM-Based Anomaly Detection of Process Instances Benchmark and Tweaks翻译
  • 文件类漏洞总结, 文件包含, 文件上传, 文件下载
  • SpringBoot篇---第四篇
  • Knife4j使用教程(一) -- 在不同版本SpringBoot,选用不同的Knife4j相关的jar包
  • Octave Convolution学习笔记 (附代码)
  • SpringSecurity 认证实战
  • echarts中横向柱状图的数字在条纹上方
  • 【仙逆】尸阴宗始祖现身,王林修得黄泉生窍诀,阿呆惊险逃生
  • C++二叉树剪枝
  • ZooKeeper中节点的操作命令(查看、创建、删除节点)