• 一、ffmpeg的认识与安装


    一、ffmpeg的认识与安装

    初识ffmpeg(一)

    一、什么是FFmpeg

    • FFmpeg是一套可以用来记录和转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。
      它提供了录制、转换以及流化音视频的完整解决方案。其软件内部包含了非常先进的音频/视频编解码库libavcodec,

    • 为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

    • FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。

    存在问题:ffmpeg与mpeg、H264等编码格式是什么关系?
    问题解析:FFmpeg是一套用于处理各类编码音视频编码格式的计算机软件,其中当然也包括了mpeg、H264这两种编码格式的软件。

    二、编解码的基本概念

    1、编解码器(CODEC):能够进行视频和音频压缩(CO)与解压缩(DEC),是视频编解码的核心部分。


    2、容器/多媒体文件(Container/File):没有了解视频的编解码之前,总是错误的认为平常下载的电影的文件的后缀(avi,mkv,rmvb等)就是视频的编码方式。事实上,刚才提到的几种文件的后缀并不是视频的编码方式,只是其封装的方式。一个视频文件通常有视频数据、音频数据以及字幕等,封装的格式决定这些数据在文件中是如何的存放的,封装在一起音频、视频等数据组成的多媒体文件,也可以叫做容器(其中包含了视音频数据)。所以,只看多媒体文件的后缀名是难以知道视音频的编码方式的。


    3、流数据 Stream,例如视频流(Video Stream),音频流(Audio Stream)。流中的数据元素被称为帧Frame

    三、FFmpeg的组成

    1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;


    2、libavcodec:用于各种类型声音/图像编解码;


    3、libavutil:包含一些公共的工具函数;


    4、libswscale:用于视频场景比例缩放、色彩映射转换;


    5、libpostproc:用于后期效果处理;


    6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码;


    7、ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;


    8、ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

    四、ffmpeg源码获取与编译

    4.1、Windows篇

    ffmpeg的官方网站是:http://ffmpeg.zeranoe.com/builds/

    FFMPEG分为3个版本:Static,Shared,Dev。其中 Static 顾名思义就是静态库版本了。Shared则是动态库版本。Dev则是提供给开发者用的Lib文件。

    注:FFMPEG最新版已经是3了,不过我们用的还是2.5的,当然也可以用其他的,如2.8。基本上版本2的API都是没差的,因此对开发没有影响。

    版本区别:

    • Static里面只有3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll已经被编译到exe里面去了。

    • Shared里面除了3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,还有一些Dll,Shared版本的exe体积很小,他们在运行的时候,需相应的Dll。

    • Dev版本:是用于开发的,里面包含了库文件xxx.lib以及头文件xxx.h,这个版本不包含exe文件。

    • 备注:应用程序在开发期间需要用到dev版本下的lib库,应用程序编译后执行期间需要shared中的dll库文件的支持

    • windows下安装:https://blog.csdn.net/lanchunhui/article/details/70477042

    4.2、Linux篇

    4.2.1、PC版本FFmpeg交叉编译

    //yasm是汇编编译器,因为ffmpeg中为了提高效率用到了汇编指令,所以需要先安装。
    1、sudo apt-get install yasm
    或者
    tar -xvf yasm-1.3.0.tar.gz
    cd yasm-1.3.0/
    ./configure
    make
    make install
    
    //2、安装编码库x264和x265库
    H.264是ITU(International Telecommunication Union,国际通信联盟)和MPEG(Motion Picture Experts Group,运动图像专家组)联合制定的视频编码标准。而x264是一个开源的H.264/MPEG-4 AVC**视频编码函数库,是最好的有损视频编码器。同样的片源、码率1、编码器默认设置下,用x264编码的视频(一般是mkv或mp4格式)一定会比rmvb画质更好。x264是一种编码方式。
    x265是一个用于编码,符合高效率视频编码(HEVC/H.265)标准的视频开源自由软件及函数库。
    由上可知,x264和x265库主要是用来给视频编码的,`而博主暂时的工作只是接收网络流,然后解码处理,所以就不添加x264和x265库的需要了!`
    
    //3、安装音频库以及相关文件
    SDL(Simple DirectMdeia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、
    声音、输入输出的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台的应用软件。
    
    3.1、sudo apt-get install libasound2-dev
    
    3.2、unzip SDL2-2.0.5.zip
    cd SDL2-2.0.5/
    ./autogen.sh
    ./configure --prefix=/usr/local/
    make
    sudo make install
    
    //4、安装FFMPEG //PC下安装直接指定目录,其它大部分采用默认
    ./configure 
    --prefix=/usr/local/lib/ffmpeg3.3.2_pc 
    --enable-shared 
    --disable-static 
    --enable-ffplay	 #enable-ffplay	  //如果没有安装上述音频库,即使加上了该选项也不能生成ffplay	可执行程序
    make
    make install
    
    2、ffmpeg使用
    ./ffmpeg  	//若出错找不到(libavdevice.so.57)这个动态库。 
    ldd ffmpeg  //来查看运行当前可执行文件需要哪些动态库
    使用find或者locate可以在/xxx/ubu_ffmpeg/lib中找到这个动态库,链接到/etc/ld.so.conf即可,具体过程:
    sudo vi /etc/ld.so.conf.d
    /xxx/ubu_ffmpeg/lib //在conf文件中加入如下
    sudo ldconfig  //最后执行生效
    
    或者在profie中添加环境变量
    export LD_LIBRARY_PATH=/opt/ActiveP/lib:$LD_LIBRARY_PATH
    
    
    
    
    //测试使用:
    //ffmpeg是用于转码的应用程序。 
    //ffplay是用于播放的应用程序。 
    //ffprobe是用于查看文件格式的应用程序。
    ./ffmpeg -version
    ffplay test.avi
    ffmpeg -i input.avi output.ts
    ffprobe test.avi
    

    4.2.2、ARM版本FFmpeg交叉编译

    4.2.2.1、编译脚本

    #!/bin/sh
    ./configure 
     --prefix=/usr/local/arm/ffmpeg-2.5.11 
     --enable-shared 
     --enable-cross-compile 
     --cross-prefix=/work/fsl-linaro-toolchain-2.13/bin/arm-linux- 
     --arch=arm 
     --target-os=linux 
     --enable-gpl 
     --enable-pthreads 
     --disable-stripping 
     --disable-ffplay
    

    4.2.2.2、可能出错问题

    //出错问题1:
    ../libavutil/libm.h:62: error: static declaration of 'lrint' follows non-static declaration  
    ../libavutil/libm.h:69: error: static declaration of 'lrintf' follows non-static declaration  
    //解决办法:ffmpeg/libavutil/libm.h 里的所有static方法全都注释掉
    
    //出错问题2:lrint、lrintf、round、roundf错误
    //解决办法:在config.h搜索lrint、lrintf、round、roundf等对于的字符
    #define HAVE_LLRINT 1  
    #define HAVE_LLRINTF 1  
    #define HAVE_LRINT 1  
    #define HAVE_LRINTF 1  
    #define HAVE_ROUND 1  
    #define HAVE_ROUNDF 1  
    

    六、ffmpeg、ffplay、ffprobe基本用法

    https://www.cnblogs.com/renhui/p/9223969.html //good
    https://blog.csdn.net/kaikai136412162/article/details/80746961
    https://blog.csdn.net/kangweijian/article/details/54906514
    https://blog.csdn.net/doublefi123/article/details/24325159
    https://blog.csdn.net/kingvon_liwei/article/details/79271361
    https://blog.csdn.net/pyl574069214/article/details/52513195

  • 相关阅读:
    Dat2Rin.exe + runpkr00.exe 将*.T0* 数据转换成Rinex文件
    使用scipy.spatial.Delaunay 三角网的构建
    tinkphp3第三方类库引入问题
    git 撤销更改
    nginx各种配置
    elastic教程
    centos添加动态库默认搜索路径
    JSwebsocket问题:One or more reserved bits are on: reserved1 = 1, reserved2 = 1, reserved3 = 0
    关于脚本手动正常运行,放入crontab无效的问题
    mysql相关操作
  • 原文地址:https://www.cnblogs.com/retry/p/9680029.html
Copyright © 2020-2023  润新知