团队——天亮说晚安
核心功能
- 读入任意文件,转换为二进制文件。
- 编码为图形码,并生成可播放的视频。
- 信息接收者通过手机录制的视频,重新解码为文件,并显示在屏幕上。
核心技术
核心代码说明
文件读入模块
//@ char* pathC; 保存了文件路径 FILE* f = fopen(pathC, "rb"); //打开文件 char ch; fseek(f, 0, SEEK_END); //定位到文件末 int nFileLen = ftell(f);//获取文件长度 fseek(f,0,SEEK_SET);//定位到文件头 for(int i=0;i<nFileLen;i++) { ch=fgetc(f); //@ std::vector<char> fileReadin; fileReadin.push_back(ch); //将字符存入ch末尾 } fclose(f);//关闭文件
为了读取任意类型的文件,我们没有用feof()
来判断文件尾。在后续项目中,还会出现读取一“帧”数据的情形,使用for循环确定std::vector<char> fileReadin
的长度是个更好的选择。
编码视频生成模块
int fourcc = cv::VideoWriter::fourcc('a','v','c','1');//文件编码格式h.264的一种 std::string fileName=outputPath+"/vid_output.mp4"; vid_out=cv::VideoWriter(fileName.toStdString(),fourcc, 24, FRAME, 0);//视频输出流
视频的写入用到的是OpenCV的cv::VideoWriter
,该类是依靠开源库FFMPEG实现的。使用该类时,需要确定写入视频的路径,编码格式,帧率,尺寸和色彩。fourcc
定义了写入视频的编码为AVC1
,它是h.264
编码的一种,并封装为.mp4
格式,确保所有主流播放器都可以正常的打开和播放。
videoFrame=std::vector<cv::Mat>(fileReadin.size()); for(int j=1;j<=fileReadin.size();j++){ //...增加定位符,写入videoFrame[i] ...... for (int i = 0; i < 8; i++) { if (c & 0x01) { //...增加图形码,写入videoFrame[i] ...... } c >>= 1; } //写入视频文件 vid_out<<videoFrame[j]; for(int d=0;d<WHITEFRAMES;d++) //插入空白帧 vid_out<<videoFrame[0]; } //释放视频文件 vid_out.release();