H5的video标签让前端开发者用一行代码就可以实现视频和音频的播放,然而,有时候我们会突然发现,某些Mp4格式的视频在Chrome下居然无法正常播放?这究竟是什么原因呢?这篇文章主要分析了部分Mp4文件在Chrome下无法正常播放的原因,最后,将会给出相应的解决方案~

一、先从video标签讲起

在2000年代初期到后期,网络上的视频播放主要依靠Flash插件,这是因为当时没有其它方法可以在浏览器上流式传输视频,然而,并非所有浏览器都拥有相同的插件,同时,如果用户如果没有安装Flash插件,则无法播放任何视频

为了填补这个空白,WHATWG开始研究HTML标准的新版本,并在HTML5中规定了一种通过video标签来包含视频的标准方法。在HTML5中,在页面中播放视频非常简单,只需要在页面中添加具有很少属性的视频标签即可~

<html>
<head>
<meta charset="UTF-8">
<title>My Video</title>
</head>
<body>
<video src="some_video.mp4" width="1280px" height="720px" />
</body>
</html>

到目前为止,Internet Explorer 9+、FireFox、Opera、Chrome和Safari等浏览器中都已经支持<video>标签,同时,<video>也能够支持MP4、WebM和Ogg等不同视频格式文件的播放,因此,采用video标签在Web站点实现视频的播放已经成为了开发者的首选~

然而,前不久在做一个项目时,发现在Chrome下有些MP4视频文件居然不能正常播放了!!!!在这个项目中,主要包括了教师端和学生端,在教师端中,老师可以上传MP4格式的视频作为课件,而在学生端中,学生可以打开视频进行学习。当我用Chrome登录到学生端时,可以看到很多课程列表,接着,我打开了一个MP4课件进行学习

嗯~这个视频看起来挺正常的呀,于是我又选择了另一个MP4视频进行播放~

咦?怎么这个MP4视频在播放时不能看到图像而只能听到声音了?于是我又打开了IE,发现这个视频在IE中居然又可以正常播放了!

明明都是MP4视频格式的文件,为什么在Chrome中一些MP4格式的视频就不能正常播放了?要想弄清楚里面的原因,还需要先从视频的文件格式、封装格式和编码方式讲起~

二、视频格式及编码方式简介

1、视频文件格式

在Windows系统中,我们所创建的文件都带有后缀,如.doc等,Windows设置后缀名的目的是让系统中的应用程序来识别并关联这些文件,让相应的文件由相应的应用程序打开,比如我们双击.doc文件时,它会知道让Microsoft Office去打开而不是用PhotoShop去打开这个文件~

一般来说,常用的视频文件格式通常包括了.mpg、.mkv、.wmv和.mp4等,当我们双击这些文件时,它会和我们电脑安装的视频播放器关联,并且打开视频播放器进行播放~我们可以随意改扩展名,但是千万不要以为将.avi改为.mp4,视频就变成mp4格式了,要想真正的转换,还需要采用如格式工厂等工具进行转换。

2、视频封装格式

视频封装格式是指把编码器生成的多媒体内容(视频、音频和字幕)混合封装在一起的标准。简单点讲,视频封装格式其实就是相当于一种存储视频信息的容器,我们可以往这个容器中嵌入任何形式的数据、各种编码的视频和音频~我们平时看到的.avi、.mpg和.vob这些视频文件格式的后缀名即采用相应的视频封装格式的名称。

一般来说,常见的视频封装格式主要包括了以下几种:

(1)AVI格式(文件后缀为.avi):Audio Video InterLeaved,音频视频交错格式,这种视频格式图像质量好,但是体积过于庞大,压缩标准不统一

(2)DV-AVI格式(文件后缀为.avi):Digital Video Format,由索尼、松下、JVC等多家厂商联合提出的一种家用数字视频格式

(3)QuickTime File Format(文件后缀为.mov):美国Apple公司开发的一种视频格式,默认的播放器是苹果的QuickTime,具有较高的压缩比率和较完美的视频清晰度

(4)MPGE格式(文件后缀可以是.mpg、.mpeg、.mpe、.dat、.vob、.asp、.3gp和mp4等):Moving Picture Experts Group,运动图像专家组格式,MPGE目前包括三个压缩标准,分别是MPEG-1、MPEG-2和MPEG-4

(5)WMV格式(文件后缀为.wmv或.asf):Windows Media Viedo,微软推出的一种采用独立编码方式并且可以直接在网上实时观看视频节目的文件压缩格式

(6)Real Video格式(文件后缀为.rm或.rmvb):Real Networks公司所制定的音频视频压缩规范

(7)Flash Video格式(文件后缀为.flv):由Adobe Flash延伸出来的一种流行网络视频封装格式

(8)Matroska格式(文件后缀为.mkv):一种新的多媒体封装格式,可以把多种不同编码的视频及16条或以上不同格式的音频和语言不同的字幕封装到一个Matroska Media档内

3、视频编码方式

视频编码方式是指能够对数字视频进行压缩或者解压缩(视频编码)的程序或设备,通常这种压缩属于有损数据压缩,通过特定的压缩技术,可以将某个视频格式转化成另一种视频格式~从视频诞生到发展,无疑在追求更高质量的画质和尽可能低的比特率,下图主要给出了视频编码方式的发展。

从上图可以看出,目前常见的编码方式式主要包括了以下几种:

(1)H.26X系列:包括H.261、H.262、H.263、H.264和H.265

(2)MPEG系列:包括MPEG-1第二部分、MPEG-2第二部分、MPEG-4第二部分和MPEG-4第十部分

(3)其它系列:AMV、AVS、Bink、CineForm、Cinepak、Dirac、VP3、VP5、VP6、VP7、VP8和VP9等

在目前的编码方式中,最新的就是大家关注的H.265和VP9,不过由于历史的积累和浏览器的支持问题,现在还是以H.264编码的视频为主~

综上所述,其实对于同一种视频文件格式,如.mpg文件,它其实包括MPEG-1、MPEG-2和MPEG-4几种不同的视频封装格式,而对于MPEG-4又可以使用多种视频编码格式,因此,视频的编码格式才是一个视频文件的本质所在,不要简单的通过文件格式和封装格式来区分视频~

三、部分MP4视频文件无法在Chrome下播放的原因

搞清楚了视频的文件格式、封装格式和编码格式,让我们再回归到前面说的那个问题中~前面提到了部分MP4视频文件无法在Chrome正常播放的问题。而通过前面的分析,我们可以知道,对于两个不同的.mp4视频来说,虽然它们的后缀名是一样的,但是两个MP4视频采用的编码格式可能是不一样的,它们可以采用H.264或H.265的编码格式进行编码,也可以采用MPEG-4的编码方式。而对于MP4视频文件的播放,Chrome只支持标准的H.264方式编码。因此如果MP4视频的编码格式不是H.264,那么这个视频文件就无法正常播放~

那么,为什么Chrome只支持H.264这种编码方式而不支持所有的视频编码方式呢?Google查了一下,网上给出的原因主要是说因为绝大部分的视频编码格式都要付专利费的,Google已经购买了H.264编码格式,而其它的就没有购买了~因此如果一个MP4视频不是H.264格式的,那么Chrome也是不支持播放的~

四、解决方案

既然对于MP4视频文件来说,Chrome只能支持H.264编码方式视频文件的播放,而由于MP4视频文件可能包含多种编码,因此,较好的解决方案就是对上传的MP4视频文件进行转码,将非H.264编码方式的MP4视频文件转换成H.264编码方式的视频,这样就能够保证所有的MP4视频文件在Chrome上正常播放~

1、ffmpeg转码

网上Google了一圈,发现很多方法都是推荐采用ffmpeg工具进行转码,通过使用ffmpeg,就可以轻松使用命令行进行视频转码~

如果你的电脑是mac,那么ffmpeg的安装非常简单,只需要下面一句命令行就搞定了

brew install ffmpeg

我们也可以通过npm进行安装ffmpeg,并且在node中使用

npm install ffmpeg //安装
var ffmpeg = require('ffmpeg');

通过下面的命令,我们就可以轻松的将MP4视频文件转换成H.264编码方式的视频

ffmpeg -i input.mp4 -vcodec h264 output.mp4 //h264默认转码

然而,在实际的业务中,我们并不能总要求用户只上传H.264编码方式的MP4视频文件,更好的方式是能够实现MP4视频文件的自动转码而无需用户自己进行转码,因此,最后我们采用了前端MP4视频编码格式判断+后台视频文件转码的方案解决~

2、前端MP4视频编码格式判断+后台视频文件转码

首先,当用户上传MP4文件时,前端会对MP4视频文件的编码格式进行判断。如果该视频文件是H.264编码格式,则将事先约定的字段is_transcode设置为0,告诉后台无需对该文件进行转码。如果不是H.264编码格式,则将is_transcode设置为1,告诉后台需要将该MP4视频文件转换成H.264编码格式的视频。

那么,问题又来了,前端怎么进行判断一个MP4视频文件是不是H.264编码格式呢?在这里,就需要获取当前视频编码的信息,也就是Codec,并且根据Codec进行视频编码格式的判断。而为了获取到Codec,我们可以借助现有的一些插件,如mediainfo.js(https://github.com/buzz/mediainfo.js)或mp4box.js(https://github.com/gpac/mp4box.js)进行获取,而由于medianinfo.js的体积较大,mp4box.js比较轻量,因此实现过程中采用了mp4box.js进行视频编码格式的检测。

为了使用mp4box.js,我们首先需要先进行mp4box.js的安装

npm install mp4box --save

接着就需要在我们的项目中引入mp4box.js

import mp4box from 'mp4box'

由于在mp4box.js中,如果一个MP4视频文件的编码格式为H.264,则其Codec是会包括avc这个字符串的,因此我们可以通过判断Codec中是否包含"avc"从而进行H.264视频编码格式的判断

示例代码如下:

var input  = document.getElementById("file"); // 获取上传的文件
input.onchange = function() {
var file = this.files[0];
var mp4boxfile = MP4Box.createFile();
var is_transcode = 0;
mp4boxFile.onReady = function(info){
let mime = info.mime
let codec = mime.match(/codecs="(\S*),/)[1]
if (codec.indexOf('avc') === -1) {
is_transcode = 1; // 需要转码
}
// 进行文件上传操作
...
}
if(file){
// 读取mp4的buffer
var reader = new FileReader();
var buffer = reader.readAsArrayBuffer(file);
reader.onload = function(e) {
var arrayBuffer = e.target.result
arrayBuffer.fileStart = 0
mp4boxFile.appendBuffer(arrayBuffer)
}
}
}

最后,当后台接收到的is_transcode为1时,就将MP4视频文件进行转码,并且将转码后的视频文件保存起来,这样,无论用户上传什么编码格式的MP4视频文件,最后都能够转换成H.264编码格式的视频文件保存起来,因此,当用户下次访问页面并播放MP4视频时,就可以看到所有的MP4视频都能够在Chrome正常播放啦~

Chrome使用video无法正常播放MP4视频的解决方案的更多相关文章

  1. 解决html5中video标签无法播放mp4问题的办法

    这篇文章主要给大家介绍了关于解决html5中video标签无法播放mp4问题的办法,文中介绍的非常详细,相信会对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 最近发现了一个 ...

  2. html5播放mp4视频代码

    1.nginx支持flv和mp4格式播放 默认yum安装nginx centos7安装nginx时候应该是默认安装nginx_mod_h264_streaming模块的 # nginx -V查看是否安 ...

  3. cocos2d-x 3.0 播放MP4视频

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=545 很久以前写的一个2dx播放 ...

  4. H5的video标签在网页上播放MP4视频时只有声音没有画面

    最近做一个项目时,发现mp4文件播放时没有图像,只有声音,代码检查了N次,都没有问题,就算是直接使用网上的实例代码,也只能播放实例视频,mp4文件绝对路径,相对路径也都试了,还是不能播放我的mp4. ...

  5. 关于HTML5中Video标签无法播放mp4的解决办法

    1.首先先排除掉代码问题.路径问题.浏览器不支持问题等常规问题,这些问题另行百度. <video width="500px" height="300px" ...

  6. Centos7无法播放mp4视频(待验证)

    新安装Centos7后,发现无法正常播放本地mp4视频 可以尝试安装 yum -y install ffmpeg 安装之后,需要重启电脑才能生效 浏览器安装年flash,只能播放部分视频,也有可能是s ...

  7. HTML标签播放MP4视频

    1.使用 <object> 标签播放视频 <object width="500" height="300" data="http:/ ...

  8. c# 海康威视 Winform播放mp4视频

    最近有个视频播放系统,需要对海康的mp4格式视频进行播放,由于普通播放器无法对该视频进行播放原因是海康对视频进行了自己的编码,需要相应的解码才可以对视频进行播放. 下面是对海康威视视频播放的c#代码( ...

  9. Android[安德鲁斯] 文本Air Video 远程播放电脑视频

    苹果iOS下列.目前应用Air Video,能力iOS由Wifi远程直接播放电脑视频,无需看视频复制到手机.非常好用!最近使用Android打电话.展望类别似应用,找了很长一段时间没有找到.在仔细的思 ...

随机推荐

  1. 小程序 RecorderManager计时不准确问题

    官方文档:RecorderManager 录音管理器,内部实现计时不准确.有以下俩个问题: 点击暂停继续,当录音结束时,stop返回的时间包含了暂停的那一段时间. 正常录音,录音文件的时长有概率少个1 ...

  2. 兄弟们,我打算抠100个网站JS加密代码召唤,一个也跑不掉,这次轮到小虎牙

    摘要:友情提示:在博客园更新比较慢,有兴趣的关注知识图谱与大数据公众号吧.本次研究虎牙登录密码加密JS代码,难度不大,依然建议各位读者参考文章独自完成,实在抠不出来再参考这里的完整代码:从今天开始种树 ...

  3. 以vue+TreeSelect为例,如何将扁平数据转为tree形数据

    // 目标:将后台返回的扁平数据,根据parentId转为下拉tree <el-form-item label='下拉选择数据'> <tree-select v-model='tre ...

  4. 手写Promise看着一篇就足够了

    目录 概要 博客思路 API的特性与手写源码 构造函数 then catch Promise.resolved Promise.rejected Promise.all Promise.race 概要 ...

  5. 开源流数据公司 StreamNative 推出 Pulsar 云服务,推进企业“流优先”进程

    Apache 顶级项目 Pulsar 背后的开源流数据公司 StreamNative 宣布,推出基于 Apache Pulsar 的云端服务产品--StreamNative Cloud.该产品的发布, ...

  6. Spine学习九 - 冰冻效果

    想象这样一个效果,一个人被冰霜攻击命中,然后这个人整个就被冰冻了,那么spine动画要如何实现这个效果呢? 1.首先需要一个Spine动画,这个动画应该是相对静止的,因为人物已经被冰冻了,那么这个人儿 ...

  7. HOOK SSDK

    HOOK SSDT主要代码 #pragma once #include <ntifs.h> /* * * * * * * * * * * * * * * * * * * * * * * * ...

  8. 线上环境去除console

    npm i -D babel-plugin-transform-remove-console babel.config.js // 获取 VUE_APP_ENV 非 NODE_ENV,测试环境依然 c ...

  9. 1.异常页面: /File/ApplyFileForm.aspx 2.异常信息: 基类包括字段“PageOfficeCtrl1”,但其类型(PageOffice.PageOfficeCtrl)与控件(PageOffice.PageOfficeCtrl)的类型不兼容。

    出现页面报错的解决如下: 1.  在  .aspx  页面报错的字段  ID 名称更改: 2.  在没有重复 ID控件,先实行步骤1, 生成项目是ok的,然后,还原,原来的ID名称,再去浏览页面运行, ...

  10. 想要使用GPU进行加速?那你必须事先了解CUDA和cuDNN

    这一期我们来介绍如何在Windows上安装CUDA,使得对图像数据处理的速度大大加快,在正式的下载与安装之前,首先一起学习一下预导知识,让大家知道为什么使用GPU可以加速对图像的处理和计算,以及自己的 ...