当前位置: 首页 > news >正文

FFmpeg深入分析之零-基础

FFmpeg是相当强大的多媒体编解码框架,在深入分析其源代码之前必须要有基本的多媒 体基础知识,否则其源代码会非常晦涩难懂。本文将从介绍一些基本的多媒体只是,主要是为研读ffmpeg源代码做准备,比如一些编解码部分,只有真正了解 了多媒体处理的基本流程,研读ffmpeg源代码才能事半功倍。

下面分析一下多媒体中最基本最核心的视频解码过程,平常我们从网上下载一部电影或者一首 歌曲,那么相应的多媒体播放器为我们做好了一切工作,我们只用欣赏就ok了。目前几乎所有的主流多媒体播放器都是基于开源多媒体框架ffmpeg来做的, 可见ffmpeg的强大。下面是对一个媒体文件进行解码的主要流程:

1.    解复用(Demux)

当我们打开一个多媒体文件之后,第一步就是解复用,称之为Demux。为什么需要这一 步,这一步究竟是做什么的?我们知道在一个多媒体文件中,既包括音频也包括视频,而且音频和视频都是分开进行压缩的,因为音频和视频的压缩算法不一样,既 然压缩算法不一样,那么肯定解码也不一样,所以需要对音频和视频分别进行解码。虽然音频和视频是分开进行压缩的,但是为了传输过程的方便,将压缩过的音频 和视频捆绑在一起进行传输。所以我们解码的第一步就是将这些绑在一起的音频和视频流分开来,也就是传说中的解复用,所以一句话,解复用这一步就是将文件中 捆绑在一起的音频流和视频流分开来以方便后面分别对它们进行解码,下面是Demux之后的效果。

2.    解码(Decode)

这一步不用多说,一个多媒体文件肯定是经过某种或几种格式的压缩的,也就是通常所说的视频和音频编码,编码是为了减少数据量,否则的话对我们的存储设备是一个挑战,如果是流媒体的话对网络带宽也是一个几乎不可能完成的任务。所以我们必须对媒体信息进行尽可能的压缩。

3.    FFmpeg中解码流程对应的API函数

了解了上面的一个媒体文件从打开到解码的流程,就可以很轻松的阅读ffmpeg代码,ffmpeg的框架也基本是按照这个流程来的,但不是每个流程对应一 个API,下面这副图是我分析ffmpeg并根据自己的理解得到的ffmpeg解码流程对应的API,我想这幅图应该对理解ffmpeg和编解码有一些帮 助。

Ffmpeg中Demux这一步是通过avformat_open_input()这个 api来做的,这个api读出文件的头部信息,并做demux,在此之后我们就可以读取媒体文件中的音频和视频流,然后通过 av_read_frame()从音频和视频流中读取出基本数据流packet,然后将packet送到avcodec_decode_video2() 和相对应的api进行解码。


后续会对ffmpeg的代码进行深入探讨,本文知识一个铺垫!

分类:  视频 流媒体

本文转自快乐就好博客园博客,原文链接:http://www.cnblogs.com/happyday56/p/4009335.html,如需转载请自行联系原作者

相关文章:

  • linux 查看文件数
  • Android Studio中架包打包和依赖冲突解决
  • 二十三、oracle pl/sql分类三 包
  • 自己写的一部分斗地主的程序,没有去写界面,临时是用黑框来显示的
  • 《计算机网络(第五版)》中学习理论与实践
  • ADB操作命令相关
  • IBM云对象存储Cleversafe 大力拓展全新战场
  • ETHERCHANNEL的配置
  • 使用 FreeMarker 替换 JSP 的 10 个理由
  • flex中textinput限制输入长度与某些字符
  • RxJava 2.x 使用最佳实践
  • 在Cisco路由器上实现PPTP server及 Radius认证
  • svn用户权限管理
  • Oracle数据库管理之创建和删除数据库
  • 浮点数溢出错误
  • android图片蒙层
  • canvas 绘制双线技巧
  • Docker: 容器互访的三种方式
  • Docker下部署自己的LNMP工作环境
  • golang 发送GET和POST示例
  • Java精华积累:初学者都应该搞懂的问题
  • js作用域和this的理解
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • python 装饰器(一)
  • React+TypeScript入门
  • Redis学习笔记 - pipline(流水线、管道)
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • swift基础之_对象 实例方法 对象方法。
  • 前端
  • 前端知识点整理(待续)
  • 人脸识别最新开发经验demo
  • 少走弯路,给Java 1~5 年程序员的建议
  • 物联网链路协议
  • 线上 python http server profile 实践
  • 学习HTTP相关知识笔记
  • 延迟脚本的方式
  • 异常机制详解
  • 优秀架构师必须掌握的架构思维
  • Linux权限管理(week1_day5)--技术流ken
  • 组复制官方翻译九、Group Replication Technical Details
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • (python)数据结构---字典
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)视频码率,帧率和分辨率的联系与区别
  • ***通过什么方式***网吧
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET Micro Framework初体验
  • .Net6 Api Swagger配置
  • .Net各种迷惑命名解释
  • @JsonFormat与@DateTimeFormat注解的使用