• 关于FFmepg的冷知识,这一篇就够了


    每一个从事音视频技术开发的工程师对FFmpeg都不会感到陌生,即使是刚刚踏入这个行业的初学者,但对他们来说这条路上好像有着一条不可逾越的鸿沟,“雷神”和许多大神都总结过一些FFmpeg的学习方法,小编在这里为大家做一个整理,方便大家有一个清晰的思路。

    以下是截取自CSDN对“雷神”的悼念:

    中国传媒大学通信与信息系统专业攻读博士雷霄骅,CSDN的老朋友、连续两届CSDN博客之星、微软MVP、博客排名52位,他的博客帮助了很多人,除了在博客上回复大家的问题,以及还有自己的技术交流群,旨在为视音频技术同行方便交流提供一个平台。不幸的是,2016年7月17日凌晨猝死在学校主楼五层,据相关报道称,事发前雷霄骅一直泡在实验室忙碌,怀疑其是劳累过度导致猝死。

    基本介绍

    FFmpeg是一套非常知名的音视频处理的开源工具,它包含了开发完成的工具软件、封装好的函数库以及源代码供我们按需使用。FFmpeg提供了非常强大的功能,可以完成视频采集、音视频的编码、解码、转码、后处理(抓图、水印、封装/解封装、格式转换等),还有流媒体服务等诸多功能,可以说涵盖了音视频开发中绝大多数的领域。

    使用FFmpeg作为内核视频播放器:

    Mplayer,ffplay,暴风影音,QQ影音,KMplayer……

    使用FFmpeg作为内核的Directshow Filter:

    ffdshow,lav filters……

    使用FFmpeg作为内核的转码工具:

    ffmpeg,格式工厂……

    原生的FFmpeg是在Linux环境下开发的,但是通过各种方法(比如交叉编译等)可以使它运行在多种平台环境上,具有比较好的可移植性。

    FFmpeg历史

    FFmpeg项目最初是由Fabrice Bellard发起的,从2004年起由Michael Niedermayer领导进行维护。许多FFmpeg的开发者同时也是MPlayer项目的成员,FFmpeg在MPlayer项目中是被设计为服务器版本进行开发。

    2011年3月13日,FFmpeg部分开发人员决定另组Libav,同时制定了一套关于项目继续发展和维护的规则。

    FFmpeg编解码器的演进

    迄今为止,在FFmpeg项目中已经创建了具有相应编解码器和一种容器格式的两种视频编码格式。两个视频编解码器是无损FFV1,以及无损和有损的Snow编解码器。

    2010年夏天,FFmpeg团队的Fiona Glaser,Ronald Bultje和David Conrad宣布退出ffvp8解码器,通过测试证明ffvp8比Google的libvpx解码器更快,从0.6版本开始,FFmpeg也开始支持WebM和VP8。

    2013年10月,原生VP9和OpenHEVC解码器——一个开源的高效率视频编码解码器,被添加到FFmpeg中。

    2016年,本地AAC编码器被认为是最稳定的,消除了对来自VisualOn和FAAC的两个外部AAC编码器的支持。FFmpeg3.0(昵称“爱因斯坦”)保留了Fraunhofer FDK AAC编码器的构建支持。

    FFmpeg的耻辱柱

    由于FFmpeg和Libav是在LGPL、GPL下发布的,任何人都可以遵守协议的情况下自由使用。目前有很多播放软件都使用了FFmpeg和Libav的代码,但却没有将任何源代码公开。FFmpeg和Libav社区便将这些违反协议的公司、组织、个人的网址贴在“耻辱柱”上,并与这些公司、组织、个人商讨如何解决版权争议。

    文末名片免费领取音视频开发学习资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

    FFmpeg组成

    FFmpeg主要由三个部分构成。

    第一部分是四个不同作用的工具软件,分别是:

    • ffmpeg.exe:音视频转码器;

    • ffplay.exe:简单的音视频播放器;

    • ffserver.exe:流媒体服务器;

    • ffprobe.exe:简单的多媒体码流分析器。

    第二部分是为各个不同平台编译完成的库,开发者可以根据自己的需求使用这些库开发自己的应用程序。

    • libavcodec:包含音视频编码器和解码器;

    • libavutil:包含多媒体应用常用的简化编程的工具,如随机数生成器、数据结构、数学函数等。

    • libavformat:包含多种多媒体容器格式的封装、解封装工具;

    • libavfilter:包含多媒体处理常用的滤镜功能;

    • libavdevice:用于音视频数据采集和渲染等功能的设备相关;

    • libswscale:用于图像缩放、色彩空间、像素格式转换等功能;

    • libswresample:用于音频重采样和格式转换等功能。

    第三部分是整个工程的源代码,无论是编译好的可执行程序还是SDK,都是使用这些源代码进行编译的。FFmpeg的源代码由C语言实现,主要在Linux平台进行开发。

    FFmpeg工具的使用

    ffmpeg工程包可以从官网“Download”页面下载,它提供了三种不同的模式:Static、Shared和Dev。前面两个版本可以直接在命令行中使用,区别在于:Static中只有3个应用程序(ffmpeg.exe,ffplay.exe和ffprobe.exe),而且每个体积都很大,相关的Dll已经被编译到exe中;而Shared中除了上面提到的3个应用程序外还有一些Dll,比如avcodec-54.dll。而且Shared中的exe体积很小。相对于前两个版本,Dev版本是用于开发的,没有exe文件,而是包含了库文件.lib和头文件.h。

    1.ffmpeg.exe

    ffmpeg.exe可以说是整个工程的核心,它的主要功能是完成音视频的转码:ffmpeg.exe可以将视频文件由原格式转换为其他格式,如从.avi转为.mp4:

    ffmpeg -i ../video/IMG_001.MOV../video/output_mpeg4_mp3.avi

    ffmpeg默认将视频编码格式选择为mpeg4,音频编码格式为mp3。如果希望保留原始编码,则需要增加参数“-c”(copy,表明不做任何转码操作)。如果需要将视频转换为其他编码格式,则需要在参数中指定目标格式-c:v libx265或-vcodec libx265。

    ffmpeg支持的所有编码器格式可以通过以下命令查看:

    ffmpeg.exe -encoders

    在视频解封装方面,ffmpeg可以将视频中的音频和视频流分别提取出来:需要在命令行中添加参数-an和-vn,分别表示屏蔽音频和视频流。

    2.ffplay.exe

    ffplay.exe是使用ffmpeg库和SDL库开发的,可以用作FFmpeg API的测试工具。ffplay最简单的使用方法是直接按照默认格式播放一个音视频文件或流:

    ffplay.exe -i../video/IMG_001.MOV

    除此以外,ffplay还支持传入各种参数来控制播放行为,具体参数可以参考官网的文档。

    3.ffprobe.exe

    ffprobe.exe可以用于查看音视频文件格式。最简单的使用方法和ffplay类似:

    ffprobe.exe -i../video/IMG_001.MOV

    分析完成后,ffprobe会显示音视频文件中包含的每个码流的信息,包括编码格式、分辨率、码率、帧率等信息。

    FFmpeg源代码分析

    了解了FFmpeg库的使用之后就可以开始看源代码,需要注意的是FFmpeg的源代码只有在Linux下才能编译,如果是在Windows环境下就需要使用MinGW进行编译。推荐使用Eclipse查看FFmpeg的源代码。

    小编献上雷神分享的一份很完整的ffmpeg源代码的分析文档:

    http://download.csdn.net/download/leixiaohua1020/6377803

     

  • 相关阅读:
    计算机毕业设计django基于python街区医院管理系统(源码+系统+mysql数据库+Lw文档)
    MongoEngine 简介安装、连接、数据类型及其参数详解
    Mybatis——一对多关联映射
    程序员的实用神器之——通义灵码
    【JavaSE】泛型通关教程
    Linux ALSA源码分析(基于Linux 5.18)
    `算法知识` 模意义下的乘法逆元
    长春理工大学2014年全国硕士研究生统一入学考试自命题试题
    【鸿蒙】创建第⼀个鸿蒙项⽬
    gitlab图形化界面使用
  • 原文地址:https://blog.csdn.net/yinshipin007/article/details/128045246