版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】无需Flash录视频——HTML5中级进阶
视频采集本篇介绍的栗子都是在chrome47版本以上的,低版本的可能会出现白屏和错误。随着Chrome版本的升高,安全性问题也越来越被重视,较新版本的Chrome浏览器在调用一些API时需要页面处在安全环境中。本篇文章所介绍的API函数,都需要在安全环境中执行。如果处在非安全环境下(http页面)这些API就会有意想不到的问题。比如getUserMedia()就会报出警告,并执行出错。而在设备枚举enumerateDevices()时,虽然不会报错,但是他隐藏了设备label。注意:第一次在一个安全页面下执行enumerateDevices()时也会隐藏label,在允许使用摄像头等设备后,第二次执行才会显示label。getUserMedia()nolongerworksoninsecureorigins.Tousethisfeature,youshouldconsiderswitchingyourapplicationtoasecureorigin,suchasHTTPS.Seehttps://goo.gl/rStTGz
formoredetails.getUserMedia()nolongerworksoninsecureorigins.Tousethisfeature,youshouldconsiderswitchingyourapplicationtoasecureorigin,suchasHTTPS.Seehttps://goo.gl/rStTGz
formoredetails.根据谷歌的意思,常用的安全环境有如下http://localhosthttps开头的地址页面如果你做了一个视频测试的页面,想嘚瑟给局域网的其他人,但是又没有域名证书怎么办?这时候只能通过修改其他人的hosts文件了比如你的测试服务器IP地址是8,那么其他人的hosts文件修改如下:#localhost
localhost
8当使用别人的Chrome浏览器访问
http://localhost/[getUserMediaTestPage]时,就会顺利的执行这些API了。但是移动端的浏览器并不认localhost,就算你修改了hosts,移动端的浏览器根本不理你,解析都不解析。所以想在手机上测试,只能老老实实申请个证书了。在开启摄像头之前,先要把可以使用的麦克风和摄像头(输入设备)列出来,如果没有这两样设备也就无法继续。代码如下:<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>这时候可以通过浏览器给出的菜单下拉选择设备。我们可以通过代码来指定使用哪个摄像头和麦克风设备。也可以通过代码设置视频的宽、高和帧率。代码如下:<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的官方文档链接如下:/TR/mediacapture-streams/可是Chrome并没有遵循它,而且差距还挺大...视频保存Chrome浏览器是大力推广webm的视频格式的。可以用MediaRecorder.isTypeSupported("video/webm")来测试是否支持这种类型的编码。如果返回true,那么我们录制的视频就可以被保存为这种指定的格式。如果不指定,那么将会使用浏览器自动指定的文件格式。文档原话如下Ifthisparamaterisnotspecified,theUAwilluseaplatform-specificdefaultformat.Ifthisparamaterisnotspecified,theUAwilluseaplatform-specificdefaultformat.但是这个默认值却无法直接获取,全靠猜...我们使用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团
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 博野县2024年小升初语文自主招生备考卷含答案
- 《嫩江农场2016年农业机械购置补贴实施方案》补充方案
- DBJ-T 15-18-2021 混凝土砌块墙体工程技术规程
- 天然气开采业的技术提升与装备升级
- 专题02 世界地理概况(解析版)2024年中考地理一模试题分类汇编(湖北专用)
- 废弃资源综合利用的节能与资源节约策略
- 2024年个人面试自我介绍
- 2024年一千零一夜读书心得
- 2024年中学寒假安全教育教案
- 2024年中医师承学习心得体会
- 房屋合同租赁合同
- 新版九年级物理教学质量抽测分析报告
- 国家电网智能化规划总报告
- 2024年江西省吉安南收费站招聘高速公路收费员5人历年高频考题难、易错点模拟试题(共500题)附带答案详解
- 常州市溧阳市2022-2023学年八年级下学期历史期末试卷(含答案解析)
- 健康指南特发性炎症性肌病常见症状及应对方法
- 2024年一线及新一线城市职场人心理健康洞察报告
- 初中化学中考指导书
- 灭火毯的使用方法和注意事项
- 环保行业数据分析培训
- 新时代军队使命任务
评论
0/150
提交评论