ffmpeg音视频开发实战,经典再升级-ffmpeg音视频核心技术全面精讲+实战
FFmpeg 概述FFmpeg 是一个领先的多媒体框架和功能强大的开源库,用于处理音频和视频,包括流解码、编码、转码、流混合、流媒体分离,并且几乎允许过滤和播放所有格式的音频和视频内容。 API 处理音频和视频。您还可以使用FFmpeg 命令来编辑音频和视频文件。
包含音频、视频和字幕流的多个解码器和编码器,以及多个比特流过滤器。那么音视频文件有哪些属性呢?可以使用ffmpeg -i命令查看媒体文件信息。
» ffmpeg -i r1ori.mp4ffmpeg 版本4.1 版权所有(c) 2000-2018 FFmpeg 开发人员使用Apple LLVM 版本10.0.0 (clang-1000.10.44.4) 构建。 -enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags='-I/Library/Java/JavaVirtualMachines/jdk1.8.0 _251.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/darwin' --host-ldflags=--enable-ffplay --enable-gpl - -enable-libmp3lame --enable-lipopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma - -enable-chromaprint --enable-frei0r --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfdk-aac --enable-libfontconfig --enable-libfreetype --enable- libgme --enable-libgsm --enable-libmodplug --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenp64 --enable-librsvg --enable-librtmp --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtesseract --enable-libtwolame --enable-libvidstab --enable-libwavpack --enable-libwebp --enable-libzmq --enable-opencl --enable-openssl --enable-videotoolbox --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags=-I/usr/local/Cellar/openjpeg/2.3.0/include/openjpeg-2.3 --enable-nonfree libavutil 56 . 22.100/56. 22.100 libavcodec 58. 35.100/58. 35.100 libavformat 58. 20.100/58. 20.100 libavdevice 58. 5.100/58. 5.100 libavfilter 7. 40.101/7. 4 0.1 01 libavresample 4.0.0/4.0 。0libswscale 5. 3.100/5. 3.100 libswresample 3. 3.100/3. 3.100 libpostProc 55. 3.100/55. 3.100/55. 3.100输入0,MOV,MP4,M4A,M4A,3GP,3GP,3G2,3G2,MJ2,MJ2 0 Major_Brand : Isom Minor_Version : 512 Compatibility_Brand : isomiso2avc1mp41 编码器: Lavf58.20.100 持续时间: 00:00:58.53,开始: 0.000000,比特率3336 0 1870 kb/s 流#0:0(und): Video: p64(高)(avc1 /0x31637661),yuv420p,544x960 、1732 kb/s、29.83 fps、29.83 tbr、11456 tbn、59.67 tbc(默认)Metadata: handler_name : VideoHandler Stream #0:1(und): Audio: aac (LC) (mp4a /0x6134706D)、44100 Hz 、立体声、fltp、129 k b/s (默认) Metadata: handler_name : 除了视频元信息之外,SoundHandler 还包含最初编译的其他设置。要隐藏此信息,您可以选择-hide_banner 参数。完整的命令是:
»ffmpeg -i r1ori.mp4 -hide_bannerInput #0、mov、mp4、m4a、3gp、3g2、mj2,来自“r1ori.mp4”: 元数据: 主要品牌: isom 小版本: 512 兼容品牌: isomiso2avc1mp41 编码器: Lavf58。 20.100持续时间: 00:00:58.53,开始: 0.000000,比特率: 1870 kb/s流#0:0(und):视频: p64(高)(avc1 /0x31637661),yuv420p,544x 960、1732 kb/s、29.83 fps、29.83 tbr、11456 tbn , 5 9.67 tbc (默认) Metadata: handler_name : VideoHandler Stream #0:1(und): Audio: aac (LC) (mp4a /0x6134706D), 44100 Hz, 立体声, fltp, 129 kb/s (默认) Metadata: 句柄r_name : SoundHandler at至少您需要为输出文件指定的主要内容之一是一些数据:
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'r1ori.mp4': # Input #0 表示通过ffmpeg -i 参数输入的第一个文件,下标从0 开始。您可以输入多个文件。事实上,ffmpeg还支持输出多个文件。元数据代表视频的元信息。期间。该行包含视频时长58.53 秒、播放开始时间0 和比特率。整个文件为1870kbit/sStream # 0:0(und): Video: p64。该行表示文件中的第一个流是视频流,编码格式为H264格式(封装格式为AVC1),每帧数据表示为yuv420p,分辨率为544x960,视频的码率码流为1732kbit/s,帧率为29.83帧/s。 Stream #0:1(und): Audio: aac,该行表示该文件的第二个流是音频流,编码格式为ACC(封装格式为MP4A),使用的profile为LC spec,采样率为44.1 表明KHz,声道为立体声,码率为129kbit/s。 FFmpeg 结构的默认编译生成4 个可执行文件和8 个静态库。可执行文件包括用于转码、流式传输和转储媒体文件的ffmpeg。这八个静态库,用于播放媒体文件的ffplay,用于检索媒体文件信息的ffprobe,以及作为简单流媒体服务器的ffserver,实际上是FFmpeg中的八个模块:
AVUtil:核心工具库。该模块是最基本的模块之一。下面的许多其他模块都依赖该库来执行基本的音频和视频处理操作。 AVFormat:文件格式和协议库。该模块是最重要的模块之一。模块封装了协议、解复用器和复用器层,使协议和格式对开发人员透明。 AVCodec:Codec库,这个模块也是最重要的模块之一,它封装了编解码层,但是有些编解码器有自己的。由于许可的原因,FFmpeg 默认情况下不会添加libx264、FDK-AAC、lame 等库,但是FFmpeg 就像一个平台,允许您以插件的形式添加其他第三方编解码器并进行开发,可以提供给人。集成接口AVFilter:音频和视频过滤器库。该模块提供包括音频和视频特效在内的处理。在使用FFmpeg API进行编解码的过程中,直接使用该模块进行音频特效处理是非常有用的。和视频数据。一个方便且非常有效的方法是AVDevice:输入/输出设备库。例如,如果需要编译工具ffplay来播放声音或视频,则需要确保该模块是打开的,同时也因为设备模块使用了libSDL库来进行声音和视频的播放,所以需要预编译libSDL。 SwrRessample:该模块可用于对音频进行重采样,将数字音频转换为数字音频的声道数、数据格式以及各种基本信息。采样率。 SWScale:转换图像格式的模块。例如,您可以将YUV 数据转换为RGB 数据。 PostProc:该模块可用于后处理。如果使用AVFilter,则必须开启该模块进行过滤器,该模块的一些基本功能在如何引入第三方编解码库到FFmpeg平台中使用到。下面以最常用的LAME、X264、FDK-AAC为例,假设有LAME静态库和头文件,以及LAME目录下的三个目录。然后修改编译脚本如下:
要添加新的X264编码器,需要添加以下脚本: --enable-muxer=p64 \--enable-encoder=libx264 \--enable-libx264 \--extra-cflags="-Iexternal -libs/x264 /include" \ --extra-ldflags=”-Lexternal-libs/x264/lib” \要添加新的LAME编码器,需要添加以下脚本: --enable-muxer=mp3 \--enable-encoder=libmp3lame \--enable-libmp3lame \ --extra-cflags=”-Iexternal-libs/lame/include” \--extra-ldflags=”-Lexternal-libs/lame/lib” \ 要添加FDK-AAC 编码器,您需要添加以下脚本: --enable -encoder=libfdk_aac \--enable-libfdk_aac \--extra-cflags=”-Iexternal-libs/fdk-aac/include” \--extra-ldflags=”-Lexternal -libs/fdk-aac/lib”\是根据自己的应用场景,修改脚本文件来编译任何需要编译的第三方库,然后在命令行模式或者API调用中使用。
FFmpeg 由两个主要部分组成。
1、工具软件部分是编译好的ffmpeg.exe、ffplay.exe、ffserver.exe、ffprobe.exe等程序。
ffmpeg.exe:音视频转码、转换器ffplay.exe:简单音视频播放器ffserver.exe:流媒体服务器ffprobe.exe:简单多媒体码流分析器2.Library Files 部分该部分由用户使用,可在使用的开发SDK是为各种平台编译的库。由于上述四个工具软件都是完整的产品,因此这些库是它们的组件,如果您愿意,您可以使用这些库来开发自己的应用程序。这些库具有以下特点:
libavcodec:包含音频和视频编码器和解码器。 libavutil:包含多媒体应用程序中常用的用于简化编程的工具,例如随机数生成器、数据结构、数学函数和其他函数。 libavformat:包含各种多媒体容器格式的封装和解封装工具。 libavfilter :包含多媒体处理中常用的滤镜函数libavdevice :用于音视频数据采集和渲染等设备相关功能ibswscale :图像缩放、色彩空间和像素格式转换函数libswresample :用于音频重采样和格式转换功能概述: FFmpeg是一个功能强大的专业音视频处理库。很多播放器都是基于FFmpeg开发的。文中提到的函数仅列出了FFmpeg中可用函数的一部分。另外,您还可以提交FFmpeg相关的学习资料。高级音视频提供了高级音视频学习手册。希望本手册对大家学习音视频有一定的帮助。
好了,以上就是我今天要分享的内容。如果您觉得有帮助,请点赞和分享。如果文章有问题,欢迎指正。欢迎大家讨论。评论区或者后台~