1.FFMPEG编译裁剪移植
2.音视频流媒体直播工作原理,码转码直播CDN、码转码推流拉流、码转码流媒体服务
FFMPEG编译裁剪移植
1.ffmpeg文件结构说明
1.1 ffmpeg模块说明
libavformat
用于各种音视频封装格式的码转码生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的码转码格式解析协议,为 libavcodec 分析码流提供独立的码转码java最牛源码音频或视频码流源。
libavcodec
用于各种类型声音/图像编解码。码转码该库是码转码音视频编解码核心,实现了市面上可见的码转码绝大部分解码器的功能。
libavdevice
硬件采集、码转码加速、码转码显示。码转码操作计算机中常用的码转码音视频捕获或输出设备。
libavfilter
音视频滤波器的码转码开发,如宽高比、码转码裁剪、格式化、非格式化伸缩。
libavutil
包含一些公共的o轴指标源码工具函数的使用库,包括算数运算、字符操作。
libavresample
音视频封转编解码格式预设等。
libswscale
原始视频格式转换,用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb、rgb 等与 yuv 等之间转换。
libswresample
原始音频格式转码。
libpostproc
同步、时间计算的简单算法,用于后期效果处理;音视频应用的后处理,如图像的去块效应
在编译ffmpeg源码之前,我们可以通过配置编译参数选择是否编译生成如上库。一般而言,要实现最基本的音视频编解码功能,libavformat,libavcodec,深度分析源码kotlinlibavutil这三个库是不可缺少的。我们通过使能或失能ffmpeg支持的组件,如编解码器、分流器、合流器、解析器、协议类型等,来裁剪库文件的大小。
1.2名词解释
encoder // 编码器
decoder // 解码器
hwaccel // 硬件加速器
muxer // 合流器
demuxer // 分流器
parser // 解析器
bsf // 比特过滤器
protocol // 协议
indev // 输入设备
outdev // 输出设备
filter // 过滤器
相关学习资料推荐,点击下方链接免费报名,先码住不迷路~
音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
免费分享音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击 加群免费领取~
2.编译
ffmpeg 编译帮助
主要包含一下选项
Help options // 帮助选项,可以查看全部支持的编解码,硬件加速器,苹果源码泄露事件解析器、输入输出设备等参数的列表,一般做裁剪时需要查询;
Standard options // 标准选项,主要是目录路径相关的设置,常用的为--prefix=PREFIX 设置安装路径;
Licensing options // license 相关选项 GPL使能设置相关;
Configuration options // 配置选项,常用的--disable-static关闭静态库 默认是开启静态库编译的--enable-shared 使能动态库编译,编译出动态库--enable-small优化大小而不是注重运行速度;
Program options // 编译出工具文件,一般的bin文件,常用的ffmpeg ffprobe 和ffplay三个工具的bin文件编译;
Documentation options // 文档选项,是否构建文档页面,个人猜测是工具的帮助文件是否编译进去,里面支持html manpage txt等格式文件;
Component options // 组件选项,常用使能或者关闭某些模块的编译,libavformat,libavcodec,libavutil这三个库一般是不可或缺的,还有其他的组件按自己需要使能;
Individual component options // 独立的组件选项,更为具体的揭阳网校系统源码组件编译选项,如果需要剪裁一般情况先使用--disable-everything 关闭全部的组件,然后再单独开启需要的组件;
External library support // 扩展库支持,允许FFmpeg链接到相应的外部库;
Toolchain options // 工具链选项,交叉编译常用,比较常用的--arch=ARCH 指定系统架构 --cpu=CPU指定cpu类型 --cross-prefix交叉编译工具链前缀 --enable-cross-compile 使能交叉编译--target-os=OS指定操作系统;
Advanced options (experts only) // 高级选项,一般较少使用,不懂的请慎用,以免引进bug;
Optimization options (experts only): --disable-asm关闭所有的优化选项
Developer options (useful when working on FFmpeg itself): --disable-debug 关闭调试符号信息,减小库大小;
2.1全编配置
采用默认配置 交叉编译,在当前目录下output文件夹生成对应的文件
编译后的文件夹下有bin include lib share 目录bin存放交叉编译后的ffmpeg等工具bin文件,include目录存放头文件,移植需要 lib存放动态和静态库,将lib里面的文件拷贝到板端或者静态库使用即可;
编译后未经裁剪的ffmpeg库实在太大,十几M的大小,需要裁剪;
2.2裁剪库
ffmpeg 库过大,很多功能其实没必要使用的, 裁剪为仅支持mp4 和 avi两种格式的视频,avi:视频采用h编码,音频采用pcm_alaw mp4:视频h,音频aac格式;这个指令其实还可以进一步裁剪,不想麻烦,够用就行,不再裁剪@_@;
裁剪后的文件大小最大也只剩1.1M,大小减少倍;
3.ffmpeg移植问题
3.1时间冲突问题
libavutils/time.h文件名字和linux系统的time.h的名字冲突,在编译的时候会出现time.h文件是有两个,无法区分是哪个time.h,因此会出现报错,如果在ffmepg里将time.h文件重命名可以解决这个问题,但这样太麻烦而且容易出错,采用另外一种方式,将makefile的搜索路径更改为只搜索到include文件夹,然后在include文件夹下放置相关的头文件,而在调用的c文件上路径改为
这样就躲开了搜索文件名字一样的问题,其本质是将ffmpeg的time.h重新命名为libavutils/time.h
3.2函数符号导出问题
由于移植需要单独导出库内部的局部函数,如mov_write_packet mov_write_header mov_write_trailer等函数,将movenc.c对应函数的static去掉,同时在libavformat.h文件声明函数,但是生成的库会发现没有找到对应的函数符号
avi相关的函数也做同样的处理,但是avi有这个函数符号,这个问题只能反推编译过程查找哪里将函数符号屏蔽掉了采用指令
发现在生成库的时候会调用一个脚本文件,这个脚本文件最后在config.mak里面指定了
--version-script这个选项仅仅导出要使用的符号表,这个文件对应libavformat里面的就是libavformat.vlibavformat.verlibavformat.version,后两个文件都是根据第一个文件产生的,查看libavformat.v文件
显然,在这里屏蔽掉了非av开头的全部函数,所有mov开头的函数无法被外部调用,因此更改这个文件,将mov开头的函数也导出
重新编译发现可以调用mov开头的函数了。
不足之处,敬请指出,谢谢^_^
4.参考资料
CSDN 博客 SigmaStarDocs 《ffmpeg基础库编程开发》
原文 FFMPEG编译裁剪移植_ffmpeg编译到移远模块_Kingkim的博客-CSDN博客
音视频流媒体直播工作原理,直播CDN、推流拉流、流媒体服务
揭秘音视频流媒体直播的奥秘 让我们一起探索直播技术的深层世界,从直播CDN、推流与拉流,到流媒体服务的运作机制,一探究竟。 直播,是1对多实时互动的精髓,与视频会议不同,它需要的是平台与观众之间的无缝连接。我们按照以下顺序逐步解析:直播工作原理的基石
直播数据的进出通道
实时转码的魔力
直播流的输出与CDN的力量
直播的工作原理与视频文件转码在本质上是相似的,但直播需要在数据的接收和发送端进行特殊处理。直播系统的核心是视频转码程序,它从流媒体服务获取直播源数据,处理后再推送给用户。这个过程中,有两个关键角色:一个负责拉取直播源,另一个负责推送处理后的视频。 流媒体服务就像视频数据的交通枢纽,它在内存中实时缓存视频流,随着时间推移,旧数据会被新数据替换。拉流和推流,这两个术语揭示了流媒体服务的双向功能:既是数据的接收端,又是输出端。 直播源数据的获取方式多种多样,取决于应用场景。直播平台通常采用RTMP协议推流至SRS或Nginx等流媒体服务;转播则直接拉取对方的流,可能通过RTMP、HLS等协议;而录播则直接读取视频文件,无需流媒体服务的介入。 转码环节是直播的核心增值部分,除了基础的高清/流畅转换,还能实现高级功能如直播倒计时和信号中断修复。虽然简单功能可以通过设置流媒体服务实现,但直播转码程序的价值在于提供这些定制化的高级功能。 在视频数据处理完成之后,通过直播CDN进行输出分发至关重要。CDN通过边缘节点分摊压力,降低延迟,同时支持RTMP等多种观看协议。但需要注意的是,CDN通常不包含转码服务,因为转码操作会消耗大量资源,通常由云服务或本地转码软件负责。 总结来说,直播技术是音视频处理的集大成者,涉及协议的灵活性、实时转码的复杂性,以及CDN的高效分发。我们将在后续的内容中深入探讨这些细节,帮助你更好地理解和掌握直播技术的精髓。