腾讯云音视频与FFmpeg开源生态

自由与开源软件的理念,从不解、争议、接受到如今如火如荼,经历了长期的历程。国内开源软件起步较晚,但进展迅速。腾讯经过几年的开源协同运动,也取得了不少成绩。其中,腾讯云音视频在FFmpeg、SRS等重要多媒体开源社区的贡献,颇具代表性。

FFmpeg是音视频领域最著名的开源项目之一,被誉为多媒体领域的瑞士军刀,是众多音视频业务的基石。FFmpeg 6.0版本以代号Von Neumann在2月28号发布,这一版本包含了大量重要更新,其中就有腾讯云音视频团队贡献的众多有趣且颇具价值的特性。除FFmpeg外,腾讯云音视频团队还积极主导或参与了SRS、SRT、VLC等众多开源音视频项目的开发,践行云与开源社区的互利互生的信条。这些开源项目的介绍及音视频团队在其中的实践,我们也会在后续的文章中分享给大家。

FFmpeg简介

FFmpeg最初由法国程序员Fabrice Bellard于2000年发起,功能丰富,能够满足各种音视频处理、开发的需求。除了功能丰富,FFmpeg还包含大量的加速优化,在CPU上,充分利用SIMD汇编加速、多线程加速,并积极引入GPU等异构加速,以实现最高性能。经历了20多年的迭代和长期的检验,FFmpeg在代码健壮性、媒体数据处理兼容性上也首屈一指。

目前,FFmpeg的主要构成包括命令行工具和基础库两部分。

图片fftools命令行工具

  • ffmpeg:多媒体数据处理工具,包括格式转换、滤镜处理等,能够自动完成复杂的编辑功能;
  • ffprobe:多媒体数据分析工具;
  • ffplay:一个简单又功能强大的播放器。

基础库

  • libavutil:基础库,包含数据结构、字符串处理、数学计算、内存管理、日志系统等等;libavcodec:音频、视频、字幕编解码库,包含800多个编解码器;除此之外,还包含parser、bitstream filter等编解码相关联功能;
  • libavformat:传输协议、封装、解封装的实现,包含500多个媒体封装格式,50多个传输协议;
  • libswscale:图像缩放、图像格式转换等;
  • libswresample:音频格式转换、重采样等;libavfilter:音视频滤镜处理框架,实现了诸如裁剪、水印贴图、混音等功能;libavdevice:音视频采集与渲染输出;
  • libpostproc:视频后处理。

FFmpeg 6.0的重大更新

FFmpeg 6.0版本开发过程中,有190多位开发者参与了开发,改动的文件数目约3500个,其中22万行左右的代码被改动。

本次更新优化重构和新功能包括:

  • ffmpeg命令行工具重构,多线程优化;
  • AV1解码硬件加速,包括Intel、Nvidia和AMD GPU加速,以及Android系统MediaCodec解码加速;
  • 通过NDK MediaCodec实现的Android解码加速;Android MediaCodec编码(包括JNI和NDK MediaCodec两套实现);
  • 新增codec格式:Bonk、APAC等;新增音视频滤镜:adrc,afdelaysr,showcwt等;
  • 新增bitstream filter:dts2pts;快速傅里叶变换FFT优化,包含x86和ARM的汇编加速;
  • 支持新的RISC-V CPU架构。

除了增加新功能外,6.0版本还删除了一些废弃已久的API和代码。FFmpeg的开发流程不会立即删除某些API,而是先标记为deprecation,注释给出新的替代API,为用户留出时间更新。建议开发者注意编译时的deprecation警告,及时更新至新的API。(doc/APIchanges记录了API的改动)

腾讯云音视频与FFmpeg社区

从2019年至今,腾讯参与了FFmpeg社区的持续贡献,提交的Patch数目超过800个,有350个以上的Patch合并到FFmpeg主线,并拥有2位FFmpeg maintainer积极参与到开发和社区建设,深度参与了patch review、GSOC mentor、新特性开发、Bugfix等社区事务,体现了云与社区的共生共存,协同发展。腾讯云音视频也是国内外云厂商中,在FFmpeg社区投入最大的厂商之一。除去大量的bugfix以及功能增强外,腾讯云音视频团队还实现和优化了FFmpeg中的移动端硬件编解码加速、国产编解码标准支持、SRT传输协议、MP4封装格式增强等内容。移动端硬件编解码加速

腾讯云音视频团队帮助FFmpeg实现了Android平台的MediaCodec编码和AV1格式的MediaCodec解码(同时支持Java MediaCodec和NDK MediaCodec)。允许开发者以ffmpeg命令行方式调用MediaCodec编解码,支持零拷贝的方式做转码,例如:

  ffmpeg -hwaccel mediacodec 
            -init_hw_device mediacodec=mediacodec,create_window=1 
            -i input.mp4 -c:a copy -c:v hevc_mediacodec 
            -tag:v hvc1 output.mp4

其中零拷贝的方式转码性能最好,但不能使用libavfilter中的各种滤镜;采用解码到buffer做拷贝的方式,性能有损失但使得整体媒体处理链路更为灵活:


 ffmpeg -hwaccel mediacodec -i input.mp4 
            -c:a copy -c:v hevc_mediacodec 
            -tag:v hvc1 output.mp4

如果是采用库集成的方式来调用libavcodec,用OpenGL做滤镜处理,可以实现性能和速度的最佳优化。因为OpenGL的一些局限性,FFmpeg自身没有实现OpenGL滤镜,而是支持了Vulkan。

在FFmpeg libavcodec中支持硬件编解码的意义在于:

  • 统一编解码接口,让应用使用一套API来支持各个平台、各种硬件加速;
  • 在此基础上,可以方便的实现fallback策略,能够灵活的在FFmpeg的软硬件编解码器之间切换;
  • 完整的媒体处理链路支持,使得编解码与bitstream filter无缝衔接;
  • 与libavformat打通,传输、解封装、解码、编码、封装推流等一气呵成。

举一个例子,分辨率宽高非16对齐的视频,Android MediaCodec编码有兼容性问题。FFmpeg h264_metadata/hevc_metadata bsf可以用来规避MediaCodec的兼容性问题,解决方案已经集成进了MediaCodec wrapper,详见https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/mediacodecenc.c

VideoToolbox作为macOS/iOS系统的视频编解码加速接口,腾讯云音视频打通了FFmpeg VideoToolbox H.265透明视频编码的链路。下面是一个例子,将第一个视频作为base层,第二个视频作为alpha层,编码方式如下:

./ffmpeg -i base.mp4 -i alpha.mp4 
     -filter_complex '[0:v][1:v]alphamerge[v2]' 
     -map '[v2]' -pix_fmt bgra 
     -c:v hevc_videotoolbox -alpha_quality 0.3 
     -tag:v hvc1 output.mp4

支持H.265透明视频解码的功能还在持续迭代中,后续会持续完善。H.265开源全链路逐步完善,Chrome 105已经支持H.265播放,可以使用FFmpeg推SRT流到SRS服务器,将SRT转成HTTP-TS后,直接使用VLC/ffplay或Chrome/mpegts.js播放直播流。

SRT(Secure Reliable Transport)传输协议

腾讯云作为SRT联盟的一员,参与了libsrt的开发以及标准定制(https://github.com/Haivision/srt),同时维护了FFmpeg libsrt封装和VLC播放器的libsrt封装,使得SRT的生态更为丰富。这样SRT优秀的抗弱网能力、低延迟特性也能在FFmpeg中得以使用,在传输加速特别是直播推流场景获得了广泛应用。

SRT在低延迟直播场景中应用广泛,比如低延迟导播,可以做到300到500ms延迟,可以选择FFmpeg/OBS/vMix推SRT流到SRS服务器,然后使用ffplay/vMix拉流,或者用WebRTC网页观看。除去上面的方案,也可以采用腾讯云的TMIO,它除了特别针对远程传输的延迟问题的优化之外,还进一步支持了如下功能以更好的适应不同的网络条件:

  • 连接优化:通过0RTT/连接复用等,优化连接耗时。
  • 重传优化:通过对参数优化和乱序度控制等策略,相对开源版本的libsrt,解决了重传率过高的问题。
  • 拥塞控制优化:加入BBR拥塞控制算法,适应有丢包、高BDP等不同网络场景的需求。
  • 多链路传输:针对直播场景优化多网传输机制,很好的解决了单一网络不稳定导致影响传输质量的问题。
  • 终端代理加速:针对直播推流场景实现定向协议加速,提升上行推流质量。

国产编码标准支持

腾讯云音视频参与维护AVS、AVS2、AVS3系列在FFmpeg中的各种支持,积极完善AVS系列编码标准生态,支持国产化技术的应用落地,助力超高清视频产业的发展,同时腾讯云MPS也支持了相应AVS系列编解码标准。

MP4封装格式增强

MP4是使用最广泛的容器格式之一。除了修复大量兼容性bug之外,腾讯云音视频完善了fMP4格式、MP4通用加密的支持,实现了《ISO/IEC 23003-5 Uncompressed audio in MPEG-4 file format》标准和《ISO/IEC 23001-8 Coding-independent code points》标准(patch review过程中),使得MP4格式在点播和直播中获得更广泛的应用。


多媒体技术是重经验积累的技术,细节繁多。FFmpeg作为多媒体技术的一个hub,吸引了大量业内顶尖的开发者一起协作,共同开发多媒体技术的“瑞士军刀”。FFmpeg、SRS等项目降低了音视频开发的技术门槛,促进了直播、短视频等行业的繁荣。腾讯云音视频团队站在巨人的肩膀上,也会继续坚持积极贡献开源社区,和社区同行,一定也会走得更好、更远。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论