ie11浏览器,使用bottle.py提供文件浏览服务,html5浏览mp4视频,测试ie浏览器上无法播放,显示无效的视频源。
从网上下载了一个好的mp4文件,可以在ie浏览器上播放,问题应该在2个地方:mp4文件的打包字段完整性 和 h264码流的编码级别。
测试mp4文件的打包方式,使用ffmpeg提取2个mp4文件的h264的帧数据,
将h264文件使用ffmpge工具重新打包成mp4文件,然后测试播放
发现在ie中浏览2个新的mp4文件,都无法播放,原来能够播放的文件,重新打包之后,竟也无法播放,所以重点锁定在mp4的打包方式上,使用mp4box替换ffmpeg,对原始的h264进行打包
使用ie浏览发现,2个文件都可以播放了,初步锁定在mp4的文件格式上,可能打包的时候,部分的mp4 atom box内容不一致或者缺失。
使用mp4box查看原始的mp4文件信息,我们的录像文件在显示的时候直接异常:
显示iods box的内容错误,比对我们的iods,
发现,iods atom后面应该跟着4个字节的version和flag,应该是四个0,结果我们的文件打包错误,导致iods解析错误,从00 00 00 14之后的16个字节,全部修改成00,手动擦除iods这个atom,然后使用ie测试修改后的文件,发现有一台ie11的pc和surface可以播放该文件,其他两台ie11的pc无法播放该文件。现在可以定位播放问题应该和修改之后的mp4文件格式和码流没有关系,有没有可能是web服务器的MIME的问题?MIME不正确导致在不同的IE版本之间表现不同。
使用ngnix提供网络服务,使用ie进行测试,发现各个ie都可以浏览,而且包含错误的iods atom格式的mp4文件也可以播放!!!
使用ngnix 提供http服务,这些mp4都可以播放,对http进行抓包,发现 ngnix 返回的应答中,文件类型为: Content-Type: video/mp4
python的应答回应中,文件类型不同:Content-Type: video/mpeg
修改bottle.py 纠正mimetype
测试,多台IE都可以播放。
结论:
我们的mp4文件,从内容上来讲iods atom的格式是错误的,同时bottle.py提供的mp4文件服务,返回的mp4文件的内容类型也是错误的,并不是mp4而是mpeg,导致ie按照mpeg去解析,在不同的版本上,表现不同。