FFMPEG系列课程(二)读取视频帧
来源:互联网 发布:电信网络电视机顶盒多少钱 编辑:程序博客网 时间:2024/05/23 12:44
再来介绍下如何读取视频帧,打开视频参考前面的文章,首先需要创建一个帧的存放对象
AVPacket pkt;
memset(&pkt, 0, sizeof(AVPacket));
再通过 int err = av_read_frame(ic, &pkt); 读取帧数据,其中ic是之前打开的视频流句柄。读取视频帧后要注意一点av_read_frame会自动给视频帧分配空间,返回值0表示成功。
可以通过 av_packet_unref(&pkt);删除packet的控制,注意这里删除的不是packet对象的空间,而是packet对象指向的数据空间。
通过判断pkt的stream_index 成员可以判断此帧数据是不是视频
if (pkt.stream_index == videoStream),
videoStream是打开视频时存放的视频流索引,大部分文件都是0,参考前一篇文章。
extern "C"{#include<libavformat/avformat.h>}//引用lib库,也可以在项目中设置,打开视频只需要用到这三个库#pragma comment(lib,"avformat.lib")#pragma comment(lib,"avutil.lib")#pragma comment(lib,"avcodec.lib")#include <iostream>using namespace std;int main(int argc, char *argv[]){//初始化所以ffmpeg的解码器av_register_all();char path[1024] = "video.mp4";//用来存放打开的视频流信息AVFormatContext *ic = NULL;//用来存储视频流索引int videoStream = 0;//打开视频播放流//path参数表示打开的视频路径,这个路径可以包括各种视频文件//也包括rtsp和http网络视频流//第三个参数表示传入的视频格式,我这边不传递有FFmpeg内部获取//最后一个参数是设置,我们这里也不传递int re = avformat_open_input(&ic, path, 0, 0);if (re != 0){//获取到FFmpeg的错误信息char errorbuf[1024] = { 0 };av_strerror(re, errorbuf, sizeof(errorbuf));printf("open %s failed: %s\n", path, errorbuf);return -1;}//遍历视频流,里面包含音频流,视频流,或者字母流,我们这里只处理视频for (int i = 0; i < ic->nb_streams; i++){AVCodecContext *enc = ic->streams[i]->codec;//确认是视频流if (enc->codec_type == AVMEDIA_TYPE_VIDEO){//存放视频流索引,后面的代码要用到videoStream = i;//找到解码器,比如H264,解码器的信息也是ffmpeg内部获取的AVCodec *codec = avcodec_find_decoder(enc->codec_id);if (!codec){printf("video code not find!\n");return -2;}//打开视频解码器,打开音频解码器用的也是同一个函数int err = avcodec_open2(enc, codec, NULL);if (err != 0){char buf[1024] = { 0 };av_strerror(err, buf, sizeof(buf));printf(buf);return -3;}}}//创建视频帧对象AVPacket pkt;memset(&pkt, 0, sizeof(AVPacket));for (;;){//读取视频帧int err = av_read_frame(ic, &pkt);if (err != 0){//读到结尾或者出错char buf[1024] = { 0 };av_strerror(err, buf, sizeof(buf));printf(buf);break;}//判断是否是音频if (pkt.stream_index == videoStream){printf("video pkt size is %d\n", pkt.size);//视频处理,解码或者存储}//视频帧数据空间av_packet_unref(&pkt);}}
更多的资料也可以关注我csdn上的视频课程
夏老师课程专栏http://edu.csdn.net/lecturer/961
手把手教您开发视频播放器
http://edu.csdn.net/course/detail/3300
1 0
- FFMPEG系列课程(二)读取视频帧
- FFMPEG系列课程(一)打开视频解码器
- ffmpeg系列:使用C++类封装ffmpeg,封装读取视频帧功能Read()方法
- ffmpeg之读取视频帧
- [Live]《视频直播学习总结》系列之二:ffmpeg
- JAVA-ACE-架构师系列视频课程- RocketMQ(下)订单实战视频课程
- ffmpeg系列之打开ffmpeg视频解码器
- ffmpeg读取视频帧并显示相关信息
- JAVA-ACE-架构师系列视频课程- RocketMQ(上)
- ReactJS学习系列课程(React Http网络数据读取)
- ffmpeg系列-打开文件获取视频帧
- 视频开发(二) FFMPEG简介
- OpenCV学习(二)视频的读取
- ffmpeg入门小结(二)——音视频同步
- FFmpeg中的滤镜(二):视频滤镜 -- alphaextract
- android 使用ffmpeg音视频播放(二)
- android 使用 ffmpeg 进行视频转码(二)
- 视频手术刀 video bistoury(二)--ffmpeg 基石
- 命令行编译运行WordCount.java
- ExpandableListView怎么实现不同的布局?
- EF获取非跟踪数据之DBSet.AsNoTracking()
- hadoop shell执行示例wordcount jar包
- ubuntu各种软件安装问题及解决
- FFMPEG系列课程(二)读取视频帧
- java实现RDD算子
- PHP版本VC6与VC9/VC11/VC14、Thread Safe与None-Thread Safe等的区别
- spark基础
- 什么是IaaS,PaaS和SaaS及其区别
- java编写spark程序
- Python机器学习实战之逻辑回归
- SQL示例
- jdbc示例