由于工作需要,所以基本了解了一下视频的解码流程。
参考教程为:
1、王纲的《跟我一起学FFmpeg》系列
2、雷霄骅雷神的博客
原理部分暂时没有整理,后期可以补充一下知识。
ffmepg的api使用方面
1、打开一个输入流
2、设置解码器
3、读取每一个包,并获取到一帧的数据
4、交给解码器解码
下面的代码就是,读取一个视频或者文件,将其中的一帧图片保存为BGR24格式的文件,该文件加上BMP文件头即可使用图片浏览器打开。需要注意的是,这样会将图片上下翻转。所以图片会倒着显示。
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libavutil/mem.h>
#include <libswscale/swscale.h>
#include <libavutil/file.h>
#include <libavutil/imgutils.h>
#include <stdio.h>
#define myprintf(x) printf(x)
unsigned char *filecontent;
unsigned char *content;
static int parse_cmd(int argc, char * argv[])
{
int ret = 0;
if (argc < 2)
return -1;
return ret;
}
static void show_help()
{
printf("Input error!\n");
printf("Usage: ./decodec-and-display-ffmpeg <filepath/file>\n");
}
void add_header()
{
filecontent = (unsigned char*) malloc (0x5eec36);
content = filecontent + 0x36;
FILE *file = fopen("./1920*1080.bmp", "rb");
if (file < 0)
{
myprintf("file can not open!\n");
return;
}
printf("1920*1080.bmp open success!\n");
fread(filecontent, 1, 0x36, file);
printf("finish reading 1920*1080.bmp header!\n");
fclose(file);
file = fopen("./fpsave.bgr24", "rb");
fread(content, 1, 0x5eec00, file);
myprintf("finish reading ./fpsave.bgr24!\n");
fclose(file);
file = fopen("./fpsave-bgr24.bmp", "wb+");
fwrite(filecontent, 1, 0x5eec36, file);
fclose(file);
myprintf("Add header finish!\n");
}
int main(int argc, char *argv[])
{
int ret, got_picture;
int i, videoindex