FFmpeg音视频解封装
一 . 解封装用到的函数和结构体
1.av_register_all() : open 一次就调用一次
2.avformat_network_init() : 网络模块初始化
3.avformat_open_input(...) : 打开文件并解析文件
4.avformat_find_stream_info(...) : 去查找没有头文件索引 探测网络流,也没有头文件
5.av_find_best_stream(...) : 确定正确的流
6.av_read_frame : 读取AVPacket的数据
7.AVFormatContext : 添加封装 解封装 的上下文
AVStream : 存流的相关信息
AVPacket : FFmpeg解码 编码接受的数据包(从网络来的数据包需要转换成AVPacket包才可以编解码)
int av_packet_from_data(AVPacket *pkt , uint8_t *data , int size)
二.avformat_open_input()的参数讲解
1.AVFormatContext **ps 封装格式上下文
2.const char *url --------> 数据的地址(http rtp 本地)
3.AVInputFormat *fmt -------> 指定输入封装格式,一般参数为null,自行去探测(一般不使用了,除非频繁打开同一个内容)
4.AVDictionary **options -------> 一组key-value的数组
三.AVFormatContext 的结构体分析
1.AVIOContext *pb : 自定义读写格式或者从内存来读
2.char filename[1024] : 把打开文件的名字保存起来(譬如断开或者重连)
3.unsigned int nb_stream : 数组流总数的个数
4.AVStream **streams : 数组 0:视频 1:音频 AVMediaType(这里面有枚举各种流)
5.int64_t duration(AV_TIME_BASE) : 代表一个媒体文件的长度,以AV_TIME_BASE(1000000)为时间基数单位,
6.int64_t bit_rate :
void avformat_close_input(AVFormatContext **s) : 关闭封装格式的上下文的输入流
四. avformat_find_stream_info(AVFormatContext *ic , AVDictionary **options) : 探测获取封装格式的信(获得头部没有索引的文件信息)
flv(无法获得总时长) H264 : 没有头部信息
五 . AVStream的参数
1.AVRational(代表分数的含义) time_base : 时间基数(它是分数形式) duration * (time_base.num / time_base.den) ------>转换成秒
2.int64_t(%lld) duration : 单位为毫秒(以AVFormat->duration那个为准,这个只是作为参考)
3.int64_t nb_frames :
4.AVRational avg_frame_rate
5.AVCodecParameters *codecpar (音视频的参数) ------->替代AVCodecContext *codec
1).enum AVMediaType codec_type : 区分编码格式是音频还是视频
2).enum AVCodecID codec_id : 枚举编码格式
3).uint32_t codec_tag : 用四个字节来表示各种编码器
4).int format : 像素格式或者音频采样格式
5).int width,int height : 视频的宽高
6).uint64_t channel_layout (取默认值), int channel (声道数), int sample_rate , int frame_size
六 . av_find_best_stream : 获取音视频的索引
1.int av_find_best_stream(AVFormatContext *ic , enum AVMediaType type , int wanted_stream_nb , int related_stream , AVCode ** decoder_ret , int flags)
2.AVFormatContext : 封装格式的上下文
3.AVMediaType : 获取流的类型
4.wanted_stream_nb : -1
5.related_stream : ..........(相关流) -1
6.decoder_ret : 解码器相关知识目前用不到
7.flags : 目前用不到
读取数据的流的信息方法 :
audioStream = av_find_best_stream --------->获得流的索引
AVFormatContext->streams[audioStream]->codecpar->channels --------->stream[索引]->codecpar->后面就是流的信息
七.av_read_frame : 读取音视频的帧数据
1.AVFormatContext *s : 处理文件的上下文
2.AVPacket *pkt : return 0 if OK < 0 on error or end of file
八 . AVPacket 结构体的使用
1.AVBufferRef *buf : 存储引用的技术
2.int64_t pts : 表示显示时间 //pts*(num/den) num/den-------->时间基数
3.int64_t dts : 表示解码时间 //同上 如果没有B帧,pts和dts一样
4.uint8_t *data , int size : 指的是AVBufferRef里面再分配的空间
5.AVPacket *av_packet_alloc(void) : 初始化并创建AVPacket的对象,在堆上申请的空间,必须要释放
6.AVPacket *av_packet_clone(const AVPacket *src) : 创建AVPacket的对象,并用计数--------------->先创建对象(分配空间),然后再引用+1.
7.int av_packet_ref(AVPacket *dst , const AVPacket *src) : 在AVPacket创建好的前提下,手动引用+1
int av_packet_unref(const AVPacket *pkt) : 手动引用-1
8.void av_packet_free(AVPacket **pkt) : 清空对象并减引用计数(与6是一对)
9.void av_init_packet(AVPacket * pkt) : 默认初始化
10. int av_packet_from_data(AVPacket *pkt , uint8_t *data , int size) : 自定义格式或者抓取网络流转化为AVPacket包
九. av_seek_frame : 拖动进度条
int av_seek_frame(AVFormatContext *s , int stream_index , int64_t timestamp , int flags)
1.AVFormatContext : 处理文件上下文
2.stream_index : 流的索引 默认是-1 必须用视频的索引
3.timestamp : 时间戳 ----->指拖动到什么位置
4.flags : 表示移动的方法
(1).AVSEEK_FLAG_BACKWARDN 1 ----------->找到后面最近的关键帧
(2).AVSEEK_FLAG_BYTE 2
(3).AVSEEK_FLAG_ANY 4
(4).AVSEEK_FLAG_FRAME 8 --------------->找到关键帧
Logw("stream = %d size = %d pts = %lld dts = %lld flag = %d",pkt->stream_index , pkt->size , pkt->pts
,pkt->dts, pkt->flags);
FFmpeg音视频解封装的更多相关文章
- FFmpeg音视频编解码实践总结
PS:由于目前开发RTSP服务器传输模块时用到了h264文件,所以攻了一段时间去实现h264的视频编解码,借用FFmpeg SDK实现了任意文件格式之间的转换,并实现了流媒体实时播放,目前音视频同步需 ...
- FFmpeg音视频同步示例
原文地址:https://my.oschina.net/u/555002/blog/79324 前面整个的一段时间,我们有了一个几乎无用的电影播放器.当然,它能播放视频,也能播放音频,但是它还不能被称 ...
- 转载:ffmpeg 音视频合成分割
http://blog.csdn.net/jixiuffff/article/details/5709976 当然先安装了 gentoo 下一条命令搞定 emerge ffmpeg 格式转换 (将f ...
- FFmpeg简易播放器的实现-音视频同步
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
- FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑
FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没 ...
- android音视频点/直播模块开发
音视频 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能,那么作为开发一个小白, ...
- Android音视频点/直播模块开发实践总结-zz
随着音视频领域的火热,在很多领域(教育,游戏,娱乐,体育,跑步,餐饮,音乐等)尝试做音视频直播/点播功能.那么作为开发一个小白,如何快速学习音视频基础知识,了解音视频编解码的传输协议,编解码方式,以及 ...
- python+ffmpeg切割视频
什么是ffmpeg 1.1 简介 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包 ...
- 音视频处理之FFmpeg封装格式20180510
一.FFMPEG的封装格式转换器(无编解码) 1.封装格式转换 所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(对应.avi,.flv,.mkv,.mp4文件). 需要注意的 ...
随机推荐
- PHP在win7安装Phalcon框架
我的环境是64位的 Win7. 安装 Phalcon 也极其简单,只需要下载一个文件(php_phalcon.dll), 要以 phpinfo() 里面“Architecture”属性为准! 下载地址 ...
- POJ2585 Window Pains 拓扑排序
Window Pains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1843 Accepted: 919 Descr ...
- 2018.10.14 loj#516. DP 一般看规律(启发式合并)
传送门 注意到一种颜色改了之后就不能改回去了. 因此可以启发式合并. 每次把小的合并给大的. 这样每个数最多被合并logloglog次. 如果维护一棵比较下标的平衡树的话,对于答案有贡献的就是每个数与 ...
- 2018.10.05 NOIP模拟 上升序列(状压dp)
传送门 状压dp好题. 首先需要回忆O(nlogn)O(nlog n)O(nlogn)求lislislis的方法,我们会维护一个单调递增的ddd数组. 可以设计状态f(s1,s2)f(s1,s2)f( ...
- redis学习-有序集合(zset)常用命令
zadd:有序集合增加一个或者多个键值对 与set集合不同,zset添加的时候需要 指定 score,这个是用来排名的 zrange:返回指定范围的键 zcount:返回集合指定范围的个数(以每个键值 ...
- win7 精简板 安装ardunio uno r3驱动
http://www.arduino.cn/thread-2350-1-1.html 下载那个64位的 http://www.keyes-robot.cn/forum.php?mod=viewthre ...
- UVa 11464 Even Parity (二进制法枚举)
题意:给你一个n*n的01矩阵,让你把最少的0变成1,使得每个元素的上,下,左,右的元素(如果有的话)之和均为偶数. 析:最好想的的办法就是暴力,就是枚举每个数字是变还是不变,但是...时间复杂度也太 ...
- 20155236 2016-2017-2 《Java程序设计》第七周学习总结
20155236 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 Calendar是个抽象类,java.util.GregorianCalendar是其子类, ...
- Winfrom 嵌入word、excel实现源码
效果图: winform中嵌入word的方法有多种:调用API,使用webBroser或使用DSOFRAMER控件: API过于繁琐: webbroser读取小文件还行,大文件就太痛苦了: 所以还是选 ...
- linux 各项配置汇总
DNS配置 linux动态地址无需配置DNSlinux配置静态地址时,需要重新设置DNS,DNS的地址为:自己所用网络商的DNS地址,其中DNS地址还分区域例如:电信 江苏南京dns:218.2.13 ...