• Android IOS WebRTC 音视频开发总结(四九) ffmpeg介绍


    本文主要介绍ffmpeg,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,个人微信公众号blacker,更多详见www.rtc.help

    说明:

    ps1:如果直接从webrtc开始学习音视频,你可能没听过ffmpeg,也不需要用到,但随着个人能力提升,你会发现这套东西确实很有用。

    就我目前接触到的音视频企业,还没有碰到过没用过ffmpeg的(视频厂商都会对用户上传的视频文件做转码,因为他们的客户端在播放的时候需要根据不同客户端的网络带宽适配不同分辨率,或做些自定义开发),由此可见其强大之处。

    ps2:介绍ffmpeg的文章很多,很多都写得很详细,所以我也没有必要从头到尾介绍,本文主要是综合官网和各位前辈的成果(末尾有说明文章来源),然后加入一些直白的解释,以便于大家能更好地理解。

    下面开始ffmpeg学习之旅:

    1,有不少人不清楚“FFmpeg”应该怎么读。它读作“ef ef em peg”

      

    2,ffmpeg作用是什么?

    回答:对视频文件进行编码,转码,播放,剪辑,加字幕都可以用到ffmpeg,下面是官网的详细解释:

    2.1,“FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created”。

    2.2,A complete, cross-platform solution to record, convert and stream audio and video

    3,哪里用到了ffmpeg?

    回答:几乎主流的多媒体播放框架都用到了ffmpeg,如Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音...

    下面是ffmpeg播放多媒体文件的流程:

    3.1.    解复用(Demux)

    当我们打开一个多媒体文件之后,第一步就是解复用,称之为Demux。为什么需要这一步,这一步究竟是做什么的?

    我们知道在一个多媒体文件中,既包括音频也包括视频,而且音频和视频都是分开进行压缩的,因为音频和视频的压缩算法不一样,既然压缩算法不一样,那么肯定解码也不一样,所以需要先对音频和视频分别进行解码。

    虽然音频和视频是分开进行压缩的,但是为了传输过程的方便,将压缩过的音频和视频捆绑在一起进行传输。

    所以我们解码的第一步就是将这些绑在一起的音频和视频流分开来,也就是传说中的解复用.

    所以一句话,解复用这一步就是将文件中捆绑在一起的音频流和视频流分开来以方便后面分别对它们进行解码,下面就是Demux之后的效果。

    3.2.    解码(Decode)

    这一步不用多说,一个多媒体文件肯定是经过某种或几种格式的压缩的,也就是通常所说的视频和音频编码。

    编码是为了减少数据量,否则的话对我们的存储设备和网络带宽都是很大的挑战,所以我们必须对媒体信息进行尽可能的压缩。

    3.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进行解码。

    4,更多ffmepg资料参考:

    4.1,http://blog.csdn.net/leixiaohua1020/article/details/15811977,雷神这边资料很多,很丰富。

    4.2,http://blog.chinaunix.net/uid-26611383-id-3976154.html,上面第三点主要参考自三哥这边。

    4.3,http://ffmpeg.org/,官网

     转自:https://www.cnblogs.com/lingyunhu/p/rtc49.html

  • 相关阅读:
    LeetCode100-相同的树
    LeetCode66-加一
    LeetCode102-二叉树的层序遍历
    dubbo协议端口
    http错误-413 Request Entity Too Large
    【Jeecg Vue】通过getAction的finally来最大程度避免影响主数据呈现
    图片压缩,用这个就够了
    信息数据安全,日常办公你就要注意这些!
    java笔记:流式编程 数组与List集合互转
    改状态,你会改吗?你真的会改吗?
  • 原文地址:https://www.cnblogs.com/javalinux/p/14445746.html
Copyright © 2020-2023  润新知