如何使用C#可靠识别视频文件的环绕声音频格式
视频环绕声音频格式可靠识别方案
你目前找到的基于文件名字符串截取匹配的思路完全不具备通用性,你贴的C#代码本身还存在逻辑bug:isAudioFormat变量初始值为false,全程无赋值为true的分支,根本不会进入音频格式字符串拼接逻辑,完全无法正常工作。这种靠文件名猜格式的方法遇到非标准命名、标识错漏的文件就会误判,不能作为可靠方案使用。
正确实现逻辑
可靠识别不需要依赖文件名,所有音视频文件的音频流都会携带标准化的编码元数据,直接读取媒体文件内嵌的流信息即可100%准确判断格式,不存在猜测环节。
- 底层解析不要自己手写封装格式解析逻辑,直接复用成熟的开源媒体解析库即可:
- 跨平台场景优先选
FFmpeg的libavformat、libavcodec组件,支持MKV、MP4、TS、M2TS等所有主流视频封装,覆盖全部常见环绕声编码格式 - Windows平台如果不想引入第三方依赖,可直接调用系统自带的Media Foundation API读取音频流属性
- 跨平台场景优先选
- 格式判断规则(以FFmpeg返回的字段为例):
组合读取音频流的codec_id、profile、流元数据标签三个字段做判断,不要只依赖单一字段:- Dolby Digital(AC-3):
codec_id对应AC-3编码标识 - Dolby Digital Plus(E-AC-3):
codec_id对应E-AC-3编码标识,若profile字段包含Atmos标识、或流元数据存在atmos=1标签,则为Dolby Atmos(杜比全景声是E-AC3/TrueHD编码之上的扩展层,不是独立编码格式) - Dolby TrueHD:
codec_id对应TrueHD编码标识,携带Atmos扩展层时同样判定为Dolby Atmos - DTS全系列:
codec_id对应DTS编码标识,再根据profile字段区分基础DTS、DTS-HD MA、DTS:X等细分格式
- Dolby Digital(AC-3):
- 特殊场景兼容:
部分广电、蓝光原盘提取的TS/M2TS片源可能存在顶层元数据标记不全的问题,可通过读取音频帧头特征做二次校验,FFmpeg内部已经内置了这套校验逻辑,直接调用接口即可拿到准确结果,不需要自行实现帧解析。
你提供的存在逻辑缺陷的参考代码如下:
private void ParseFormat() { this.FeatureAudioFormat = AudioFormat.Unknown; if (string.IsNullOrEmpty(this.Feature)) { return; } int start = this.Feature.LastIndexOf("_", StringComparison.Ordinal) + 1; int len = this.Feature.LastIndexOf(".", StringComparison.Ordinal); bool isAudioFormat = false; var audioFormat = new StringBuilder(5); for (int i = start; i < len; i++) { if (isAudioFormat) { if (this.Feature[i] == '.') { isAudioFormat = false; } else { audioFormat.Append((char.IsUpper(this.Feature[i])) ? this.Feature[i] : char.ToUpper(this.Feature[i], CultureInfo.InvariantCulture)); } } } switch (audioFormat.ToString()) { case ATMOS: this.FeatureAudioFormat = AudioFormat.Atmos; break; case DTS: this.FeatureAudioFormat = AudioFormat.DTS; break; default: this.FeatureAudioFormat = AudioFormat.Dolby; break; } }
内容的提问来源于stack exchange,提问作者AKASGaming
相关产品推荐
相关产品推荐

