【音视频】FFmpeg打开视频 | 保存图片
1、初始化FFmpeg
av_register_all(); //初始化FFMPEG 调用了这个才能正常使用编码器和解码器
但是这个函数如今已经没什么用了,它的就是把你定义和系统初始化的编码器和解码器连接起来而已,然后就没有了。
现在解码器和编码器的初始化都是通过定义全局变量来初始化的。与原来相比,唯一的改变就是使用数组替换链表完成解码器和编码器的初始化。
2、分配一个AVFormatContext,FFMPEG所有的操作都要通过这个AVFormatContext数据结构来进行
AVFormatContext *pFormatCtx = avformat_alloc_context();
AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数。
此结构包含了一个视频流的格式内容:AVInputFormat(or AVOutputFormat同一时间AVFormatContext内只能存在其中一个),和AVStream、AVPacket这几个重要的数据结构以及一些其他的相关信息,比如title,author,copyright等。还有一些可能在编解码中会用到的信息,诸如:duration, file_size, bit_rate等。
3、打开视频文件:
char *file_path = "./movie/ifwithoutu.mp4";
avformat_open_input(&pFormatCtx, file_path, NULL, NULL);
4、视频打开之后,查找文件中的视频流
///循环查找视频中包含的流信息,直到找到视频类型的流
///便将其记录下来 保存到videoStream变量中
///这里我们现在只处理视频流 音频流先不管他
for (i = 0; i < pFormatCtx->nb_streams; i++)
{
if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
{
videoStream = i;
}
} ///如果videoStream为-1 说明没有找到视频流
if (videoStream == -1)
{
printf("Didn't find a video stream.");
return -1;
}
5、根据视频流,打开一个解码器来解码
///查找解码器
pCodecCtx = pFormatCtx->streams[videoStream]->codec;
pCodec = avcodec_find_decoder(pCodecCtx->codec_id); if (pCodec == NULL)
{
printf("Codec not found.");
return -1;
} ///打开解码器
if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0)
{
printf("Could not open codec.");
return -1;
}
FFmpeg可以让我们根据查找到的视频流信息获取到解码器,不需要知道实际用到的是什么解码器
6、读取视频
int y_size = pCodecCtx->width * pCodecCtx->height;
AVPacket *packet = (AVPacket *) malloc(sizeof(AVPacket)); //分配一个packet
av_new_packet(packet, y_size); //分配packet的数据 if (av_read_frame(pFormatCtx, packet) < 0)
{
break; //这里认为视频读取完了
}
av_read_frame读取的是一帧视频,并存入一个AVPacket的结构中
7、视频里的数据是经过编码压缩的,需要将其解码
if (packet->stream_index == videoStream)
{
ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture,packet); if (ret < 0)
{
printf("decode error.");
return -1;
}
}
8、解码器解码之后得到的图像数据都是YUV420格式的,需要将其保存成图片文件,因此需要转换为RGB格式
if (got_picture)
{
sws_scale( img_convert_ctx,
(uint8_t const * const *) pFrame->data,
pFrame->linesize,
0,
pCodecCtx->height,
pFrameRGB->data,
pFrameRGB->linesize
);
}
9、将RGB图片写入
SaveFrame(pFrameRGB,
pCodecCtx->width,
pCodecCtx->height,
index++
);
错误:
(1):改成 AV_PIX_FMT_RGB24
【音视频】FFmpeg打开视频 | 保存图片的更多相关文章
- ffmpeg打开视频解码器失败:Could not find codec parameters for stream 0 (Video: h264): unspecified size
在使用ffmpeg进行拉流分离音视频数据再解码播放操作的时候: 有时候经常会报错: Could not find codec parameters for stream 0 (Video: h264) ...
- ffmpeg 打开视频流太慢(下)
前面的博文中已经交代过,ffmpeg打开视频慢主要是因为av_find_stream_info 耗时久.下面给出重写查找音视频stream info的一段代码,用来替代av_find_stream_i ...
- FFMPEG系列课程(一)打开视频解码器
测试环境:windows10 开发工具:VS2013 从今天开始准备些FFmpeg的系列教程,今天是第一课我们研究下打开视频文件和视频解码器.演示环境在windows上,在Linux上代码也是一样. ...
- 【学习ffmpeg】打开视频文件,帧分析,并bmp保存关键帧
http://www.tuicool.com/articles/jiUzua http://blog.csdn.net/code_future/article/details/8646717 主题 ...
- 利用Ffmpeg获得flv视频缩略图和视频时间的代码
问题描述:获得flv视频的缩略图和视频时间长度 谷歌了半天发现可以使用Ffmpeg获得视频的一些信息,先介绍一下FFMEPG 这里简单说一下:FFmpeg是用于录制.转换和流化音频和视频的完整解决方案 ...
- moviepy音视频剪辑:视频剪辑基类VideoClip的属性及方法详解
☞ ░ 前往老猿Python博文目录 ░ 一.概述 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>和<moviepy音视频剪辑:moviepy中的剪辑基类Cl ...
- 使用ffmpeg 对视频截图,和视频转换格式
//执行CMD命令方法 public static void CmdProcess(string command)//调用CMD { //实例化一个进程类 ...
- NET 2.0(C#)调用ffmpeg处理视频的方法
另外:ffmpeg的net封装库 http://www.intuitive.sk/fflib/ NET 2.0 调用FFMPEG,并异步读取输出信息的代码...public void ConvertV ...
- python+ffmpeg切割视频
什么是ffmpeg 1.1 简介 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包 ...
- 使用ffmpeg进行视频截图
1.从ffmpeg的Windows Build网站(https://ffmpeg.zeranoe.com/builds/)下载ffmpeg. 2.下载后解压压缩包,得到如下左图的文件.然后打开bin文 ...
随机推荐
- jmeter进行websocket 通信
最近项目弄了基于websocket的通信接口,所以需要做一个websocket的接口压测. jmeter当前自带的插件无法进行jmeter接口的通信,所以 本人是下载的一套jar包插件,进行的安装 1 ...
- ASP.NET Core MVC中调用Json()时默认使用Newtonsoft.Json返回数据
1.需要安装两个包 Newtonsoft.Json Microsoft.AspNetCore.Mvc.NewtonsoftJson 2. Startup 类中的 ConfigureServices 方 ...
- 各版本JDK及镜像仓库
Adoptium Marketplace 毕昇(华为) Dragonwell(阿里) Tencent Kona OpenJDK OracleJDK RedHatOpenJDK Temurin(ecli ...
- k8s升级导致hostPath type check failed
一.问题背景 当前Cluster K8s Version: v1.17.4 需要升级到K8s Version:v1.19.3 在升级过程中,有个Pod卡在ContainerCreating状态 api ...
- ssm框架下的拦截器过滤静态资源以及拦截jsp
这篇文章如果能给你带来帮助 不胜荣幸,如果有错误 ,欢迎批评指正,共同进步. 今天啊搭了一个ssm的框架 虽然说现在大部分都在使用shiro权限,可是正如mybatis.hibernate和jdbc的 ...
- having对聚合函数的结果集进行过滤
SELECT rl.road_code,string_agg(distinct rs.tech_level_label, ',') from road_lst rlleft join road_sec ...
- Unity 使整个UnityUI变成彩色的BUG
最近接手了一个两年前的老项目,在这个项目里碰到一个BUG ,每次运行到这个场景的时候,整个Unity 的所有UI包括Unity界面都会变成彩色. 后来发现是因为物体丢失,代码修改Image里的图片颜色 ...
- angular 路由守卫Observable异步请求串联
假设路由守卫有这种场景 需要使用observable同时发送多个Http 请求,判断request2返回的数据中是否存在request1返回的数据 使用async await export class ...
- 微服务减少jar包体积
<build> <finalName>${project.artifactId}</finalName> <plugins> <!--打包jar- ...
- c语言中计算逻辑表达式
1.设变量m.n.a.b.c.d均为1,执行 (m=a!=b)&&(n=c!=d) 后,m.n的值为() A. 0 0 B.0 1 C. 1 0 ...