十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VLC 3.0.11原生支持AVS+与DRA:从编译到播放的完整实战指南

VLC 3.0.11原生支持AVS+与DRA:从编译到播放的完整实战指南 简介VLC 3.0.11增强版在原有开源播放器基础上额外加入AVS与DRA两种国产编码的原生支持可流畅播放采用这些编码的高清视频和数字广播音频同时兼容H.264/H.265、AC3等国际通用格式。适用于Windows 7及以上系统用户特别适合广电、IPTV、网络视频及多媒体开发调试场景解决特殊编码内容在主流播放器中无法解码的痛点。压缩包为7z格式容量约130.6MB内置解码组件与所需运行库解压后可在较旧系统上直接运行便于离线部署与格式兼容测试。已有2212人浏览学习适合媒体播放器使用者、流媒体开发者及音视频技术爱好者作为本地播放环境备选工具。通过此增强版可省去自行编译插件或寻找第三方解码器的麻烦直接体验AVS高画质与DRA多声道音频覆盖全格式播放需求。 前阵子一位做广电集成的朋友拿了一个从数字有线前端录出来的TS流给我视频是AVS音频是DRA让我找个播放器直接播。我当时直接用VLC拖进去结果画面黑屏音频也没有日志里只有一行提示说找不到avs对应的解码器。那一刻我才意识到VLC即便在Linux上装了完整的ffmpeg默认构建也未必把这两个国产广电标准接全。直到VLC 3.0.11正式把AVS和DRA解码支持合入主线这个问题才算真的从“能不能解”变成了“解得好不好”。这篇文章就围绕3.0.11版本复盘AVS和DRA到底是什么、VLC用哪条链路去解、在Debian系平台上如何验证并踩坑排雷给做广电、流媒体和监控整合的朋友一个可以直接落地参考的完整记录。1. 为什么2020年之前播放AVS和DRA还是一件麻烦事1.1 哪些业务场景在用AVS和DRAAVS是国内自主制定的视频编码标准体系按演进路径分AVS1、AVSAVS1的增强档次和AVS2几个阶段。AVS主要面向高清广播加入了8×8整数变换、加权量化、多参考帧、B帧增强等工具压缩效率对标H.264 High Profile。在现网中不少省级卫视高清频道、地面数字电视DTMB和部分卫星节目的视频码流就是AVSTS流里的伴音则可能是AAC也可能是DRA。DRA是数字音频标准对应国标GB/T 22726-2008支持单声道、双声道以及5.1环绕声常用采样率包括32kHz、44.1kHz、48kHz等码率范围比较宽适合在数字电视伴音、移动多媒体等领域使用。在部分卫星和有线前端中DRA会作为伴音与AVS视频共存于同一个TS封装流。这类码流在广播前端很常见但在PC播放器生态里属于边缘人群的需求。做安防监控或者OTT解析时也会撞上不少国产编码器、复用器默认输出的就是AVS视频流媒体网关抓取之后如果不转码很多播放器直接不认。1.2 3.0.11之前主流解法为什么这么难受在VLC 3.0.11之前要播AVS最常见的办法是转码。命令其实很简单ffmpeg -i input.ts -c:v libx264 -c:a aac output.mp4但这条路有两个硬伤一是原始AVS信号被二次有损压缩做画质评估和信号审查的人根本没法接受二是转码耗时一分钟的1080i素材在普通PC上要耗掉不少时间。关键还有第三层坑如果ffmpeg本体没有编译进对应的DRA解码器转码时遇到DRA音轨会直接报错根本走不下去。另一类做法是装广电专用码流分析软件这类软件能播但是播放控制、字幕显示、倍速处理都远不如VLC顺手。所以3.0.11把AVS和DRA放进默认构建对普通观众可能感知不强对广电相关项目人员来说是把一条“先转码再看”的老旧链路直接升级成了“原始码流拖进去就播”。这里还值得多说一句VLC之前不支持AVS并不奇怪。VLC本身不是一个“什么解码器都打包”的播放器视频解码大量依赖libavcodec而DRA在很长一段时间里没有外部库需要VLC社区在自己的模块树里单独维护。没有哪个团队有足够动力去优先处理一个只在特定行业里出现的小众标准所以它慢一点是正常的。2. AVS和DRA在VLC里的两条解码链路以及它们的技术底细2.1 AVS依赖ffmpegVLC不直接管视频解码VLC对AVS视频的解码链路很清晰VLC负责demux解封装识别出TS流里面的视频轨道然后把压缩码流交给系统libavcodec库由libavcodec里的cavs解码器完成真正的解码。在ffmpeg中AVS1及AVS都走cavs解码器。可以用这条命令确认系统ffmpeg是否支持ffprobe -decoders | grep -E cavs|avs正常会在列表里看到V..... cavs AVS (Chinese AVS (IEEE 1857.2/IEEE 1857.4)) (codec cavs)AVS的高配置文件包括隔行扫描、加权量化等特性是cavs解码器解析sequence header之后自动识别的不需要在播放器里做额外开关。也就是说只要ffmpeg版本够新VLC 3.0.11就不需要单独为AVS增加视频解码插件底层全被ffmpeg吸收了。实际编译时最容易出问题的恰恰是这个“依赖关系”。VLC链接的是哪一个ffmpeg解码能力就完全取决于那个ffmpeg。很多老发行版自带ffmpeg 3.xcavs解码器对AVS部分增强特性的支持不完整表现就是demux正常、解码器也注册了但播放时花屏、马赛克、甚至解码到一半退出。这时候要解决的就是底层的libavcodec版本而不是在VLC上找原因。2.2 DRA是VLC自带的模块不需要外部库DRA的解码链路和AVS完全不同。VLC源码的modules/codec/dra/目录下有一套独立实现的DRA解码器插件它不是调ffmpeg而是自己解析DRA比特流输出PCM样本给音频输出模块。demux在解析TS流时如果发现音频轨道的fourcc是DRA或者dra1就会匹配到dra模块的Open函数。模块读取DRA帧头拿到采样率、声道数、帧长度信息然后执行熵解码和子带合成把PCM数据送到音频输出。这里有一个容易被误解的点很多人以为DRA需要装什么专用codec包其实VLC 3.0.11之后DRA解码器是直接编进插件目录的。你不需要找额外的DRA解码库也不需要配置环境变量只要模块文件存在播放器就会自动加载。VLC的DRA解码器最初来自广电码流分析方向的参考实现移植早期一直作为实验模块存在不是默认编入构建。3.0.11这个版本真正把它转正了这也是这个版本在音视频开发圈子里被频繁提起的原因。做个对比表格方便记忆这些标准之间的关系项目AVSAVS1增强H.264 High ProfileAVS2IEEE 1857.4DRA类型视频视频视频音频标准来源GB/T 20090.2 增强档次ITU-T H.264 / MPEG-4 AVCIEEE 1857.4GB/T 22726-2008主要应用省级卫视高清、DTMB、卫星广播蓝光、流媒体、监控摄像头4K/8K 超高清广播数字电视伴音、移动多媒体压缩效率参考接近H.264 High Profile参考基准优于H.265/HEVC数个点中低码率下对语音听感较好在VLC 3.0.11中的实现位置libavcodec(cavs)libavcodec(h264)视ffmpeg版本支持modules/codec/dra3. 在Debian系上编译含AVS和DRA的VLC 3.0.113.1 系统依赖与ffmpeg预检编译之前先把系统依赖补齐。以Debian 11 / Ubuntu 20.04为例我是这样准备的sudo apt update sudo apt install build-essential git autoconf automake autopoint libtool \ pkg-config libvlc-dev libx11-dev libxcb-shm0-dev libxcb-xv0-dev \ libxcb-keysyms1-dev libxcb-randr0-dev libxcb-composite0-dev \ libxcb-xkb-dev libxcb-shape0-dev libxcb-xinerama0-dev \ libxcb-render-util0-dev libgl1-mesa-dev libgles2-mesa-dev \ libdrm-dev libasound2-dev libpulse-dev libavcodec-dev libavformat-dev \ libavutil-dev libswscale-dev libpostproc-dev libdbus-1-dev \ libxml2-dev liblua5.2-dev libogg-dev libvorbis-dev libtheora-dev libx264-dev装完后先做两件预检看libavcodec的开发库版本以及ffmpeg是否带cavs解码器。pkg-config --modversion libavcodec ffprobe -decoders | grep cavs我测试环境用的是Debian 11自带ffmpeg 4.3cavs解码器是包含在内的。如果用Ubuntu 18.04这类老系统默认ffmpeg版本偏旧建议先升级ffmpeg或者单独编译新版本ffmpeg到/usr/local避免后续播放AVS高配置流时出现兼容性问题。3.2 源码获取与configure参数源码直接走官方tar包wget https://download.videolan.org/pub/videolan/vlc/3.0.11/vlc-3.0.11.tar.xz tar xf vlc-3.0.11.tar.xz cd vlc-3.0.11configure参数我习惯写成明确开关不依赖默认值./configure --prefix/usr/local \ --enable-vlc --enable-avcodec --enable-avformat --enable-swscale \ --enable-mad --enable-libmpeg2 --enable-dvdread --enable-qt \ --enable-pulse --enable-sdl2 --enable-nls其中--enable-avcodec是VLC接入系统libavcodec的开关必须保留。DRA模块不需要configure参数它是插件编译系统自动扫描modules/codec/dra目录后生成的。configure完成后可以先用find确认模块被纳入了构建范围find . -name *dra*如果能找到dra相关的源码目录和Makefile引用就说明这个模块会被编译。然后直接make -j$(nproc) sudo make install编译量不小我的一台四核机器跑完大约需要十几分钟中途报错一般集中在缺开发包看configure输出里的“checking for ...”部分能快速定位。3.3 编译后的模块检查装完后用两个命令确认模块确实落地/usr/local/bin/vlc --version find /usr/local/lib -name libdra_plugin.so如果libdra_plugin.so存在DRA模块已经就位。AVS则不需要单独检查插件它的解码能力完全来自libavcodec只要前面ffmpeg预检通过播放器自然能用。这里顺带提醒一句Windows和macOS官方安装包里的3.0.11同样包含这些解码支持没必要非得自己编译。只有在Linux上需要定制功能或者要调试解码链路时才建议从源码走一遍。4. 播放实测如何从日志和流信息确认解码真的生效4.1 如何准备一段AVS/DRA测试流找测试流没有想象中那么容易ffmpeg本身基本不提供AVS的编码器所以不能自己随手生成一段。我的做法是从广电前端录一段TS或者用公开的DRA/AVS测试样本。拿到文件后先ffprobe确认码流情况ffprobe -show_streams input.ts如果视频轨显示codec_namecavs并且带profileAVS或者codec_tag_stringCAVS音频轨显示codec_namedra和channels2那这就是标准的AVSDRA复合流适合用来做播放验证。4.2 开详细日志验证解码链路播放时开启详细日志能直观看到VLC调用了哪些模块vlc -vvv --file-logging --logfilevlc.log --no-video-on-top input.ts关键的日志特征有这么几行视频链路出现avcodec decoder: Using AVS (Chinese standard) decoder说明cavs解码器被正常调用AVS的profile由ffmpeg自动识别。音频链路出现dra decoder: DRA: n_channels2, sample_rate48000说明DRA模块被激活且参数解析正确。如果VLC选择硬解但解码器不支持会看到vaapi或d3d11相关的报错这时可以加--avcodec-hwnone强制软解再试。播放过程中按i键打开媒体信息窗口stream 0显示编码为AVS或CAVSstream 1显示编码为DRA也能作为辅助确认。4.3 黑屏无声问题快速排查表结合我自己的实测把常见问题整理成一张表现象可能原因处理方法黑屏日志提示找不到avs解码器系统ffmpeg版本过老或不含cavs编译安装ffmpeg 4.0以上重新configure VLC有画面无伴音日志没有dra decoderdra插件未编入或未加载检查libdra_plugin.so是否存在重新make install画面花屏或马赛克严重libavcodec过旧AVS高配置支持不全换新版ffmpeg加--avcodec-hwnone强制软解音频噪声明显DRA采样率或声道数与输出设备不匹配切换--aoutalsa或--aoutpulse测试这条排查思路对VLC拉RTSP流同样适用。比如有些监控项目里海康等设备输出的虽然是H.264/HEVC但只要解码链路某一段不匹配日志定位方法是完全一样的先看有没有对应fourcc再看有没有对应decoder最后看输出模块。5. 实测中踩到的深坑以及AVS系列标准的后续演进5.1 多版本ffmpeg污染的判断和处理我实际踩过的第一个坑就是系统里存在两套ffmpeg一套是apt装的旧版本另一套是手工编译装到/usr/local的新版本。configure在pkg-config的查找路径里可能优先命中旧版但运行时动态库加载路径又可能加载新版两边不一致导致解码行为时对时错。判断方法很直接播放前用ldd确认VLC实际加载了哪个libavcodecldd /usr/local/bin/vlc | grep avcodec据此调整PKG_CONFIG_PATH让configure和运行时指向同一套ffmpegexport PKG_CONFIG_PATH/usr/local/lib/pkgconfig然后再重跑configure和make能明显减少“编译时一个版本运行时另一个版本”的诡异问题。5.2 TS解复用识别不出来的情况有些采集设备导出的不是标准TS文件而是裸码流扩展名可能是.avs或.dra。VLC直接拖进去可能只显示未知格式这不代表解码器有问题是解复用阶段就没认出封装。解决办法是强制指定demuxvlc --demuxts --demuxavformat input.avs或者把文件扩展名改成.ts再试。DRA裸流如果也识别不出建议先用ffmpeg把它封装成mkv容器ffmpeg -f dra -i input.dra -c:a copy output.mka封装之后VLC识别成功率会高很多。5.3 硬件解码和音频输出带来的干扰VLC 3.0.11默认开了硬件解码候选但AVS和DRA基本只有软解路径硬解模块不能处理这些编码。如果GPU驱动介入反倒可能造成黑屏。日志中看到vaapi或者d3d11va相关错误时别去纠结解码器直接禁用硬件解码vlc --avcodec-hwnone input.ts音频侧也遇到过特殊采样率的DRA流比如32kHz伴音走PulseAudio输出到蓝牙音箱时无声切成ALSA输出就正常。这类问题的核心在于输出链路的采样率协商和DRA本身关系不大只要用--aoutalsa或--aoutpulse来回切换验证即可。5.4 AVS系列标准的后续演进VLC 3.0.11解决的是“能不能播AVS/DRA”的问题再往后走AVS2和AVS3的支持已经逐步进入ffmpeg通过外部库libuavs2d、libuavs3d等实现新一代VLC版本也在持续改进这些国产标准的映射。现在如果用新版VLC播放AVS2的4K流链路会比3.0.11顺畅许多但底层原理没有变VLC依然负责demux和渲染真正的解码能力在ffmpeg和独立模块的双通道里。我自己的体会是AVS和DRA这两项技术本身并不弱AVS在1080i广播流里的压缩表现和H.264差距很小DRA在中低码率下对中文语音的听感也一直不错。VLC 3.0.11把它们纳入默认构建对广电从业者来说省掉的不只是一次转码而是重新建立了对原始码流的可信度。刚接触这类流的读者建议先别急着从源码编译直接用官方3.0.11或更新版本放一段广电录制的TS确认能播之后再考虑编译调试也不迟。真到了编译那一步记住三个关键词就够ffmpeg要新、依赖要全、日志要开-vvv。把这三件事盯住AVS和DRA基本不会成为你项目里的拦路虎。本文还有配套的精品资源点击获取
返回列表