赣州网站建设流程,全网加速器,专业做蜂蜜的网站,做网站视频手机在《选择最新 Chromium#xff0c;支持 H264 / H265》一文中#xff0c;记录了我通过升级 Chromium 版本解决了 H264 / H265 视频支持难题。然而难题接踵而至#xff0c;这次的难题是 MPEG TS 流的支持。MPEG2-TS 传输流广泛应用于数字电视广播系统#xff0c;所以是一个不…在《选择最新 Chromium支持 H264 / H265》一文中记录了我通过升级 Chromium 版本解决了 H264 / H265 视频支持难题。然而难题接踵而至这次的难题是 MPEG TS 流的支持。MPEG2-TS 传输流广泛应用于数字电视广播系统所以是一个不得不支持的格式。通过查询资料了解到 FFmpeg 是支持 TS 格式的但 Chromium 中并没有默认开启这个功能。这可能是出于版权、性能或者兼容性的考虑。关于如何让 Chromium 支持 TS我请教了一下 AI。AI 给的思路是修改 FFmpeg 的配置文件开启 MPEG TS 的解复用器和解码器修改 Chromium for Android 的媒体框架添加对 MPEG TS 的支持修改 Chromium for Android 的网络模块添加对 MPEG TS 的传输协议的支持。按照 AI 的建议我一步步解决了 TS 格式的支持问题。一第一步研究 Chromium 的编译参数。媒体有关的编译选项主要位于 media 目录下的 media_options/gni 文件中。研究了一下发现一个 enable_mse_mpeg2ts_stream_parser 参数目前的值是enable_mse_mpeg2ts_stream_parser proprietary_codecs (enable_cast_receiver || use_fuzzing_engine)对于 Chromium for Android上面的值是 false。看起来这个选项是与 MSE(Media Source Extensions) 有关但实际上也会影响 TS 文件的解析因为在 mime_util_internal.cc 中有这样的代码#if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)CodecSet mp2t_codecs{H264, MPEG2_AAC, MPEG4_AAC, MP3};AddContainerWithCodecs(video/mp2t, mp2t_codecs);
#endif // BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)TS 容器的 mime type 为 video/mp2t只有开启了 enable_mse_mpeg2ts_stream_parser才会加入对 TS 容器的处理。所以首先需要将 enable_mse_mpeg2ts_stream_parser 选项修改为 true。修改这个参数后立刻又碰到一个新的错误信息03-09 07:44:55.322 31903 32010 V chromium: [VERBOSE1:batching_media_log.cc(35)] MediaEvent: {error:FFmpegDemuxer: open context failed}二稍微捋一下代码可以发现 open context 的代码实际位于 FFmpegGlue::OpenContext这个方法中又会调用 FFMPEG 的 avformat_open_input 函数。接下来的调用流程:avformat_open_input - init_input - av_probe_input_buffer2 - av_probe_input_format2 - av_probe_input_format3 - av_demuxer_iterator可以很明显看出av_demuxer_iterator 就是遍历系统的 demuxer那这个 demuxer 列表来自哪儿呢查看其实现文件 allformats.c可以看到它有如下包含文件#include libavformat/demuxer_list.c也就是在 demuxer_list.c 这个文件里面进行了定义。搜索 demuxer_list.c 文件发现这个文件有多份位于 third_party/ffmpeg/chromium/config 下。这个 config 下的文件组织有些讲究最上一层是 branding也就是我们在 args.gn 下定义的 ffmpeg_branding 选项默认是 Chromiium。再下一层是按 OS 划分接下来就是按 CPU 分。找出你的目标平台修改 demuxer_list.c增加一行ff_mpegts_demuxer,接下来还要修改 FFmpegGlue::OpenContext 方法在DCHECK_NE(container_, container_names::CONTAINER_UNKNOWN);前面增加容器判断else if (strcmp(format_context_-iformat-name, mpegts) 0)container_ container_names::CONTAINER_MPEG2TS;解决了上面的错误后又会碰到新的错误03-04 09:53:29.573 28173 28233 W [FFMPEG]: Could not find codec parameters for stream 0 (Video: h264 ([27][0][0][0] / 0x001B), none): unspecified size
03-04 09:53:29.573 28173 28233 W [FFMPEG]: Consider increasing the value for the analyzeduration (60000000) and probesize (5000000) options
03-04 09:53:29.573 28173 28233 W [FFMPEG]: Could not find codec parameters for stream 1 (Audio: ac3 (AC-3 / 0x332D4341), 0 channels): unspecified sample rate
03-04 09:53:29.573 28173 28233 W [FFMPEG]: Consider increasing the value for the analyzeduration (60000000) and probesize (5000000) options
03-04 09:53:29.573 28173 28233 D [FFMPEG]: After avformat_find_stream_info() pos: 0 bytes read:36960112 seeks:8 frames:292
03-04 09:53:29.574 28173 28247 V chromium: [VERBOSE1:ffmpeg_common.cc(246)] Unknown profile id: -2659
03-04 09:53:29.575 28173 28247 V chromium: [VERBOSE1:batching_media_log.cc(37)] MediaEvent: {debug:Warning, FFmpegDemuxer failed to create a valid/supported video decoder configuration from muxed str}
03-04 09:53:29.575 28173 28247 V chromium: [VERBOSE1:batching_media_log.cc(37)] MediaEvent: {info:FFmpegDemuxer: skipping invalid or unsupported video track}
03-04 09:53:29.575 28173 28247 V chromium: [VERBOSE1:ffmpeg_common.cc(122)] Unknown audio CodecID: 86019
03-04 09:53:29.575 28173 28247 V chromium: [VERBOSE1:ffmpeg_common.cc(294)] Unknown AVSampleFormat: -1三看日志似乎是解码器创建失败有了前面的经验直接找到 codec_list.cc 文件加入如下行ff_h264_decoder,同时修改 config_components.h 文件 将#define CONFIG_H264_DECODER 0修改为#define CONFIG_H264_DECODER 1经过这样的修改后我们会发现出现很多链接错误。没有关系将缺的代码文件加入编译即可。需要注意的是有些底层代码是使用汇编语言编写在 Android 平台下就是那些以 .S 为后缀的文件。非常神奇的是clang 直接支持编译汇编语言所以将这些汇编文件和 C 文件一起加入编译列表即可。经过这样一番操作TS 流终于播放起来了。需要说明的是我测试使用的 TS 流内部视频采用的 H264 编码如果采用其他格式编码修改的过程会有所不同但思路类似。四经过上述的改造是否就完美解决问题了呢并没有。测试下来发现视频播放出来了但是没有声音从日志可以看出03-05 21:14:18.706 18936 19047 V chromium: [VERBOSE1:batching_media_log.cc(37)] MediaEvent: {debug:Warning, FFmpegDemuxer failed to create a valid/supported audio decoder configuration from muxed str}
03-05 21:14:18.707 18936 19047 V chromium: [VERBOSE1:batching_media_log.cc(37)] MediaEvent: {info:FFmpegDemuxer: skipping invalid or unsupported audio track}解决的方法类似但真正解决声音输出又花费了一番精力这个留在下一篇继续敬请关注