无需Flash录视频——HTML5中级进阶

视频采集

本篇介绍的栗子 都是在chrome 47 版本以上的,低版本的可能会出现白屏和错误。

1.安全环境

随着Chrome版本的升高,安全性问题也越来越被重视,较新版本的Chrome浏览器在调用一些API时需要页面处在安全环境中。本篇文章所介绍的API函数,都需要在安全环境中执行。如果处在非安全环境下 ( http页面 ) 这些API就会有意想不到的问题。

比如 getUserMedia()就会报出警告,并执行出错。

而在设备枚举enumerateDevices()时,虽然不会报错,但是他隐藏了设备label。

注意:第一次在一个安全页面下执行enumerateDevices()时也会隐藏label,在允许使用摄像头等设备后,第二次执行才会显示label。

getUserMedia() no longer works on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. Seehttps://goo.gl/rStTGz for more details.

根据谷歌的意思,常用的安全环境有如下

如果你做了一个视频测试的页面,想嘚瑟给局域网的其他人,但是又没有域名证书怎么办?

这时候只能通过修改其他人的hosts文件了

比如你的测试服务器IP地址是192.168.2.18,那么其他人的hosts文件修改如下:

#localhost 127.0.0.1
localhost 192.168.2.18

当使用别人的Chrome浏览器访问 http://localhost/[getUserMediaTestPage]时,就会顺利的执行这些API了。

但是移动端的浏览器并不认localhost,就算你修改了hosts ,移动端的浏览器根本不理你,解析都不解析。

所以想在手机上测试,只能老老实实申请个证书了。

2.设备枚举

在开启摄像头之前,先要把可以使用的麦克风和摄像头 ( 输入设备 ) 列出来,如果没有这两样设备也就无法继续。

代码如下:

<label for="audioDevice"> 录音设备: </label>
<select id="audioDevice">

</select>
<br>
<label for="videoDevice"> 录影设备: </label>
<select id="videoDevice">

</select>

<script>
navigator.mediaDevices.enumerateDevices().then(function (data) {
  data.forEach(function (item) {
    if(item.kind=="audioinput"){ //麦克风
     document.getElementById("audioDevice").innerHTML +=  "<option value=‘"+ item.deviceId +"‘>" + item.label + " </option> "
    }else if(item.kind=="videoinput"){ //摄像头
     document.getElementById("videoDevice").innerHTML +=  "<option value=‘"+ item.deviceId +"‘>" + item.label + " </option> "
    }
  })
},function (error) {
  console.log(error);
})
</script>

效果如下图,和浏览器自己获取的一模一样。

注意:上图的实例中,浏览器地址栏最右边的摄像头标识是需要使用 getUserMedia()函数时才会出现。

<script>
  var getUserMedia = navigator.webkitGetUserMedia; //Chrome浏览器的方法
    getUserMedia.call(navigator, {
      video:true, // 开启音频
      audio:true  // 开启视频
    }, function(stream){
        console.log(stream); // 成功获取媒体流
    }, function(error){
        //处理媒体流创建失败错误
    });
</script>

这时候可以通过浏览器给出的菜单下拉选择设备。

3.设置参数,预览

我们可以通过代码来指定使用哪个摄像头和麦克风设备。

也可以通过代码设置视频的宽、高和帧率。

代码如下:

<video id="video" autoplay></video> <!-- 一定要有 autoplay -->

<script>
var getUserMedia = navigator.webkitGetUserMedia ;

getUserMedia.call(navigator, {
  "audio":{
    "mandatory":{
      "sourceId":"" // 指定设备的 deviceId
    }
  },
  "video":{
        "optional":[ 
            {"minWidth":400},
            {"maxWidth":400},  // 数字类型,固定宽度
            {"minHeight":220}, 
      {"maxHeight":220},  // 数字类型,固定高度
            {"frameRate":"12"}  // 帧率
        ],"mandatory":{
        "sourceId":"" // 指定设备的 deviceId
        }
      }
}, function(stream){
    //绑定本地媒体流到video标签用于输出
    document.getElementById("video").src = URL.createObjectURL(stream);
}, function(error){
    //处理媒体流创建失败错误
});

</script>

输出的视频流通过blob对象链接绑定到video标签输出。

这个deviceId就是从上文设备枚举 enumerateDevices() 获取到的。

两种设备,如果有一个deviceId填写不正确,就会报出一个DevicesNotFoundError的错误。

而且一旦指定了设备后,浏览器自己的设备选择就会变成灰色不可选。

视频的宽高,并不会因为填写的数值比例不合法而失真。

比如你设定了宽度30,高度100,那么他会从视频中心截取 30x100 的画面,而不是把原画面挤压到这个30x100的尺寸。

效果如下:

如果您的预览一片漆黑,或者只有一个小黑点,那么说明您的摄像头正在被占用...

吐槽:这个getUserMedia()函数的参数,w3的官方文档链接如下:

https://www.w3.org/TR/mediacapture-streams/

可是Chrome并没有遵循它,而且差距还挺大...

视频保存

1. 格式支持

Chrome浏览器是大力推广webm的视频格式的。可以用MediaRecorder.isTypeSupported("video/webm")来测试是否支持这种类型的编码。

如果返回true,那么我们录制的视频就可以被保存为这种指定的格式。

如果不指定,那么将会使用浏览器自动指定的文件格式。文档原话如下

If this paramater is not specified, the UA will use a platform-specific default format.

但是这个默认值却无法直接获取,全靠猜...

2. 视频录制 MediaRecorder

我们使用 MediaRecorder来录制视频,参数是通过getUserMedia()获取的媒体流。

  • 通过绑定ondataavailable事件,来获取视频片段数据,并在内存中累积。
  • 录制的开始和结束分别使用 start和stop 函数。
  • 执行start之后会周期性触发ondataavailable事件。
  • 执行stop之后会停止触发ondataavailable事件。
  • 录制结束后,把累计的片段数据保存为blob对象,并从浏览器下载存为视频文件。

代码如下:

<script>

var getUserMedia = navigator.webkitGetUserMedia ;
var g_stream = null, g_recorder = null;
function startPreview(){
  getUserMedia.call(navigator, {
  video:true,
  audio:true
  }, function(stream){
      g_stream = stream;
  }, function(error){

  });
}

function stopRecording(){
  g_recorder.stop();
}

function startRecording(){
  var chunks = [];
  g_recorder = new MediaRecorder(g_stream,{mimeType:"video/webm"});
  g_recorder.ondataavailable = function(e) {
    chunks.push(e.data);
  }
  g_recorder.onstop = function(e) {
    var blob = new Blob(chunks, { ‘type‘ : ‘video/webm‘ });
    var audioURL = URL.createObjectURL(blob);
    window.open(audioURL);
  }
  g_recorder.start();
}
</script>

注意:本例并没有填写视频文件头,所以保存出来的视频文件没有时间轨,无法快进和跳跃。可以用格式工厂转

“莫基了”上面有一个录制音频的例子 传送门

这篇文章的DEMO请戳 这里

相关阅读

多屏互动——H5中级进阶前端,想说爱你不容易!



作者信息
作者来自力谱宿云 LeapCloud 团队_UX成员:王诗诗 【原创】

王诗诗,前端新人,专职前端工作两年。曾供职于AMI做底层软件开发。喜欢分析H5代码,追崇用简单的CSS,构建精美动效,做前端之前,这些是业余爱好。现任职于MaxLeap UX 组,负责MaxWon 的开发和维护。现热衷于Real-time WebApp。

作者往期佳作

无需Flash实现图片裁剪——HTML5中级进阶多屏互动——H5中级进阶

力谱宿云 LeapCloud 团队首发: https://blog.maxleap.cn/archives/1197

欢迎关注微信订阅号:MaxLeap_yidongyanfa

时间: 2024-10-08 00:55:21

无需Flash录视频——HTML5中级进阶的相关文章

MVC应用程序显示Flash(swf)视频

前段时间, Insus.NET有实现<MVC使用Flash来显示图片>http://www.cnblogs.com/insus/p/3598941.html 在演示中,它也可以显示Flash的swf媒体文件.不过你得下载那个swfobject.js组件. 本次,Insus.NET想给大家演示另外的方法,MVC与jQuery结合.你无需要下载任何第三方falsh组件. 你需要在MVC应用程序下, 根据上图中的#87代码,我们以Action方法SwfVideoDemo()创建一个视图: #1步,添

Flash的视频神奇StageVideo

在过去的几年里,视频已经成为web网页上最主流的趋势之一,这主要是由Adobe Flash Player来推动的.2007年Flash Player 9中引入了H.264和全屏支持技术,通过在web页面上的沉浸式高清视频体验,实实在在地改变了局面.最近,在移动设备上实现的Flash Player已经为Adobe公司的Flash Player项目组带来了新的思路,这些新的思路将帮助项目组解决如何在Flash中播放视频以及如何持续增强用户体验等问题.Stage video便是这些投入所得的成果. F

Android录屏命令、Android录Gif、Android录视频

NoHttp开源地址:https://github.com/yanzhenjie/NoHttp NoHttp具体使用文档已公布,你想知道的全都有,请点我移步! 版权声明:转载请注明本文转自严振杰的博客: http://blog.yanzhenjie.com 演示 大家看博客时常常看到以下这样的图片,都非常想知道怎么做的吧,好在自己写博客时也把操作录下来: 这个图是我还有一个博客的图讲Android三级联动和ListView单选多选的,博客和源代码传送门,如今呢就一步步教大家怎么来做这个图. 上方

Android 音视频深入 五 完美的录视频(附源码下载)

本篇项目地址,名字是录视频,求star https://github.com/979451341/Audio-and-video-learning-materials 这一次的代码录视频在各个播放器都可以用,有时长显示,对比上一次的代码说说为何两者效果不同,但是我先补充一些之前漏掉的MediaCodec的官方说明还有MediaCodec.BufferInfo 1.MediaCodec的补充 buffer_flag_codec_config:提示标志等含有编码初始化/编解码器的具体数据,而不是媒体

Android 音视频深入 四 录视频MP4(附源码下载)

本篇项目地址,名字是<录音视频(有的播放器不能放,而且没有时长显示)>,求star https://github.com/979451341/Audio-and-video-learning-materials1.MediaMuser说明 MediaMuser:将封装编码后的视频流和音频流到mp4容器中,说白了能够将音视频整合成一个MP4文件,MediaMuxer最多仅支持一个视频track和一个音频track,所以如果有多个音频track可以先把它们混合成为一个音频track然后再使用Med

聊天记录怎么录视频 微信聊天记录屏幕录制

互联网的发展,手机交流代替了面对面交流,手机交流更加方便快捷,也带来了一些便利,拉近了人与人之间的距离,现在大家都习惯在网上聊天了,聊天如果不删掉的话,就会有记录的.有的小伙伴想要录制成视频,但是聊天记录怎么录视频呢?使用工具:手机&聊天操作方法:1.随着短视频发展的如火如荼,比如一些抖音.快手等平台的应运而生,我们可以在上面看到很多人分享的聊天记录,不管是搞笑的,还是秀恩爱撒狗粮的,都是比较火的,下面就来教大家怎么录制聊天记录视频哦!2.打开手机上的微信,进入主页面,选择需要录制的联系人:3.

html5结合flash实现视频文件在所有主流浏览器兼容播放

由于html5的出现,让网页中的视频.音频有了更加便捷的实现方式.但是video.audio标签只在IE 9+.Safari 3+.FireFox 4+.Opera 10+.Chrome 3+的浏览器版本得到了支持,并且各浏览器对于视频编码格式的支持不一致,这就需要我们考虑一个综合的实现方案,使得视频在不同浏览器中都能顺利播放,而且在老版本的浏览器中也能得到支持. 以下是结合项目经验,总结出的几种方案,与大家分享. 方案1.使用VideoJS插件实现兼容 插件下载http://videojs.c

如何下载某些 flash 在线视频 并使用ffmpeg下载分段并加密的m3u8视频流

有些网站使用 flash 在线播放视频,不方便进行下载. 可以使用 Chrome 的 Developer Tools 模拟成 iOS 设备(通过修改 User Agent),然后取得 h.264 视频流的地址. 取得 h.264 视频流的地址 1. 在页面上打开 Developer Tools (开发者工具),点击坐上的"手机"按钮(如下图). 2. 在左边 "Device" 选择 "Apple iPhone" 或 "Apple iPa

Chrome强制更新Flash导致视频广告屏蔽扩展失效的解决办法

本文章仅对旧版本的Chrome浏览器有效.(本人环境 Chrome V31) 最近Chrome强制更新Flash至18.0.0.209,是因为Flash爆出重大漏洞,会导致运行Flash的木马网页可以入侵用户系统. 不过新版本的Flash会导致大部分的视频广告屏蔽扩展失效,而无法播放视频.那如何解决呢? 我们可以通过利用旧版本的Flash文件来覆盖新版本,让Chrome运行旧版本的Flash插件. 不过这样会让你的电脑暴露在漏洞的危险之下,本人强烈推荐你安装一款屏蔽网页Flash的插件,仅在常用