精华内容
下载资源
问答
  • G移动执法仪如何保存设备的执法录像实时录像和云端录像1、应用背景2、LiveGBS几种录像的区别3、实时录像使用3.1、实时录像接口3.1.1、 实时录像开始3.1.2、 实时录像停止3.1.3、 实时录像查询3.2、实时录像页面操作...

    1、应用背景

    移动单兵执法设备或是移动监控等设备,需要保存任务过程中的录像。而设备本身没有存储卡,需要将有效录像存储到云端(部署视频平台的服务器上面),并可以获取播放。

    2、LiveGBS几种录像的区别

    LiveGBS 支持三种形式的录像, 我们称之为 设备录像, 云端录像, 实时录像

    • 设备录像

    GB28181 国标协议范围内的录像, 存储在设备SD卡或硬盘录像机

    • 云端录像

    开启后, 只要拉流上来, 就会持续录像, 录像的起停跟随直播流的起停, 存储在服务器, 支持指定存储目录 => [基础配置] > [流媒体服务配置] > [云录像目录], 存储格式是 HLS, 可下载为 MP4

    • 实时录像

    是在直播过程中, 手动或者通过接口触发的录像, 存储在服务器, 存储格式是 MP4

    3、实时录像使用

    3.1、实时录像接口

    在线接口文档

    3.1.1、 实时录像开始

    -

    3.1.2、 实时录像停止

    在这里插入图片描述

    3.1.3、 实时录像查询

    在这里插入图片描述

    3.2、实时录像页面操作

    3.2.1、播放

    国标设备-》查看通道-》播放-》实时录像
    在这里插入图片描述

    3.2.2、点击实时录像

    在这里插入图片描述

    3.2.3、停止实时录像

    停止实时录像后,页面会自动访问下载合成的mp4录像文件
    在这里插入图片描述

    4、云端录像使用

    4.1、云端录像接口

    在线接口文档

    • 查询云端录像通道
    • 按通道统计所有录像
    • 按月查询通道录像
    • 按日查询通道录像
    • 删除单条录像
    • 删除通道所有录像
    • 按天删除通道录像
    • 重要录像标记
    • 下载录像文件
    • 指定时间段录像播放及下载(mp4合成播放下载)

    4.2、云端录像页面操作

    4.2.1、按需录像

    用户播放摄像机观看时候,才进行录像,没有观看的时候不录像

    配置 按需直播 开启
    配置 云端录像 开启

    在这里插入图片描述

    4.2.2、一直录像

    设备注册接入上来,无论有没有人观看,都进行录像

    配置 按需直播 关闭
    配置 云端录像 开启

    在这里插入图片描述

    5、相关问题

    5.1、服务器存储满了怎么办?

    LiveGBS支持录像循环覆盖,无需担心录像占满存储,点击查看详细配置

    5.2、云端录像路径如何配置?

    如何修改云端|集中录像的存储路径位置,点击查看详细配置

    5.3、网络不稳定用那种录像比较好?

    当网络不稳定的试试,实时录像中如果突然离线了,录像是没有办法保存的。可以配置调用云端录像,开启云端录像后并调用开始直播,在需要录像期间进行心跳保活。

    6、搭建GB28181视频直播平台

    展开全文
  • Android客户端和电脑服务器端用socket通讯,实时上传画面帧,在电脑服务器端可查看.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • html5 微信开发 公众号 上传图片 图片上传 视频上传 上传视频 上传文件 手机拍照上传 手机录像上传

    我cao,真不知道该怎么说。看图吧


    就是让客户点击按钮的时候可以触发到图二,手机自带的录像机。录像之后再上传。

    当时的需求就是,(微信里面的)手机页面可以上传视频,也可以想图二那样。就是可以触发手机的录像功能!!

    (说真的这功能写的真是头疼。看了各种大神的帖子博客啥的。小白,我就不诉苦了。)

    放几个链接:

    html5调用手机摄像头地址:
    http://www.qdfuns.com/notes/26716/2d4fea81a990f8532ce7fa43af286add.html

    (原来html5新特性直接就可以调用到手机的一些自带的比如相机啊,录像啥的。看到了希望。)

    图片上传地址:

    http://www.qdfuns.com/notes/18123/7110b12b485098aab5dfc2c59760688c.html

    我是写完了图片上传之后才看见这个(宝宝心里苦。)

    另外视频上传所借鉴参考文章地址:

    http://blog.csdn.net/journey191/article/details/40744015

    (这个我发现太高深我看不懂,有些方法已经过时了)

    http://www.jq22.com/jquery-info2247

    (这个我忘了,反正我也试了好久。感觉不是我要的,我就放弃了这个。)

    http://blog.csdn.net/smm188/article/details/50750437

    (这个也看了一遍就放弃。)

    我并不怎么想用插件来做。(我只想简单的做出来)

    http://www.cnblogs.com/hutuzhu/p/5254532.html

    完美解决!!!我基本就是抄的,奥,不,借鉴,借鉴。

    另外借鉴css样式地址:

    http://www.haorooms.com/post/css_input_uploadmh

    HTML

    #######################

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta name="viewport"
    content="width=device-width,initial-scale=1,user-scalable=0">
    <title>报修</title>
    <link rel="stylesheet" type="text/css" href="WEIXIN/css/weui.min.css" />
    <script type="text/javascript" src="WEIXIN/js/jweixin-1.0.0.js"></script>
    <link rel="stylesheet" href="css/font-awesome.min.css" />
    <link rel="stylesheet" href="css/common.css" />
    <link rel="stylesheet" href="css/style.css" />
    <link rel="stylesheet" href="css/flexslider.css" />
    <link rel="stylesheet" href="css/swiper.css" />
    </head>
    <style>
    /*a  upload */
    .a-upload {
        padding: 4px 10px;
        height: 20px;
        line-height: 20px;
        position: relative;
        cursor: pointer;
        color: #888;
        background: #fafafa;
        border: 1px solid #ddd;
        border-radius: 4px;
       /*  overflow: hidden; */
        display: inline-block;
        *display: inline;
        *zoom: 1
    }

    .a-upload  input {
        position: absolute;
        font-size: 100px;
        right: 0;
        top: 0;
        opacity: 0;
        filter: alpha(opacity=0);
        cursor: pointer
    }




    .a-upload:hover {
        color: #444;
        background: #eee;
        border-color: #ccc;
        text-decoration: none
    }
    .qin {
        position: fixed;
        top:0px;
        left:0px;
      width:100%;
    height:90%;
    overflow-x:hidden;
     /* overflow:scroll; */




    }




    </style>
    <body>
    <div class="qin">
    <div class="weui-actionsheet__cell" style="padding: 2px 0 2px 0">
    <h4>填写报修单</h4>
    </div>
    <div class="weui-cells__title" style="margin: 0 0 0 0">
    <h4>选择项目和设备</h4>
    </div>
    <div class="weui-cells">
    <div class="weui-cell weui-cell_select weui-cell_select-after">
    <div class="weui-cell__hd">
    <label for="" class="">项目:</label>
    </div>
    <div class="weui-cell__bd">
    <select class="weui-select" id="ProjectSelect" name="select1"
    οnchange="changeProject(this);">
    </select>
    </div>
    </div>
    <div class="weui-cell weui-cell_select weui-cell_select-after">
    <div class="weui-cell__hd">
    <label for="" class="">设备:</label>
    </div>
    <div class="weui-cell__bd">
    <select class="weui-select" id="EquipmentSelect" name="select2">
    </select>
    </div>
    </div>
    </div>
    <div class="weui-cells__title">
    <h4>文字描述</h4>
    </div>
    <div class="weui-cells weui-cells_form">
    <div class="weui-cell">
    <div class="weui-cell__bd">
    <textarea id="textExplain" class="weui-textarea"
    placeholder="文字描述尽量不要太少" rows="3"></textarea>
    </div>
    </div>
    </div>
    <!-- ************************************* -->
    <div>
    <div class="weui-cells weui-cells_form" style="margin-top: 0px"
    id=uploader>
    <div class=weui-cell style="padding-top: 5px; padding-bottom: 5px">
    <div class=weui-cell__bd>
    <div class=weui-uploader>
    <div class=weui-uploader__hd style="padding-bottom: 0">
    <p class=weui-uploader__title>图片上传</p>
    <div class=weui-uploader__info>
    <span id=uploadCount>0</span>/5
    </div>
    </div>
    <div class=weui-uploader__bd>
    <ul class=weui-uploader__files id=uploaderFiles></ul>
    <div class=weui-uploader__input-box>
    <input id=uploaderInput class=weui-uploader__input type=file
    accept=image/* capture="camera" multiple>
    </div>
    </div>
    </div>
    </div>
    </div>
    </div>
    </div>
    <!-- !!!!!!!!视频!!!!!!!!!!!!!!!!!!!!!!!!!!!1 -->
    <div class="weui-cells weui-cells_form"
    style="padding: 5px 5px 2px 17px; margin-top: 0px">




    <div class="camera-area">
    <form enctype="multipart/form-data" method="post">
    <a href="javascript:;" class="a-upload"> <input
    name="fileToUpload" class="fileToUpload" type="file"
    accept="video/*" capture="camcorder">上传视频
    </a> <span id="fileName" style="font-size: 18px"></span>
    <!-- <div class="upload-progress"><span></span></div> -->
    <!--  -->
    <div class="weui-progress">
    <div class="weui-progress__bar">
    <div id="qin_progress"
    class="weui-progress__inner-bar js_progress" style="width: 0%;"></div>
    </div>
    <a href="javascript:;" class="weui-progress__opr"> <i
    class="weui-icon-cancel"></i>
    </a>
    </div>
    </form>
    <div class="thumb"></div>
    </div>
    <a href="javascript:;" class="weui-btn weui-btn_primary"
    οnclick="submitRepairTable();">提交表单</a>
    </div>
    <script type="text/javascript" src="WEIXIN/js/zepto.min.js"></script>
    <script type="text/javascript" src="WEIXIN/js/upload.js"></script>
    <script type="text/javascript">
    $(function() {
    $(".camera-area").fileUpload({
    "url" : "./upload/custVedioCon",
    "file" : "myFile"
    });
    })
    </script>
    <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1 -->
    </div>
    <nav class="bottom-nav">
    <a href="wx_cusmenu.html" class="bottom-nav-item">
    <div class="bottom-nav-icon">
    <i class="diy-icon"><i class="fa fa-home"></i></i>
    </div>
    <div class="bottom-nav-title">首页</div>
    </a> <a href="wx_repairtable.html" class="bottom-nav-item on">
    <div class="bottom-nav-icon">
    <i class="diy-icon"><i class="fa fa-wrench"></i></i>
    </div>
    <div class="bottom-nav-title">我要报修</div>
    </a> <a href="wx_myWorkTable.html" class="bottom-nav-item ">
    <div class="bottom-nav-icon">
    <i class="diy-icon"><i class="fa fa-tasks"></i></i>
    </div>
    <div class="bottom-nav-title">我的工单</div>
    </a> <a href="wx_mydata.html" class="bottom-nav-item ">
    <div class="bottom-nav-icon">
    <i class="diy-icon"><i class="fa fa-user"></i></i>
    </div>
    <div class="bottom-nav-title">个人中心</div>
    </a>
    </nav>
    <div id="dialogs">
    <!--BEGIN loadError-->
    <div class="js_dialog" id="loadError" style="display: none;">
    <div class="weui-mask"></div>
    <div class="weui-dialog">
    <div class="weui-dialog__bd">加载数据发生错误。。。</div>
    <div class="weui-dialog__ft">
    <a href="javascript:;"
    class="weui-dialog__btn weui-dialog__btn_primary">知道了</a>
    </div>
    </div>
    </div>
    <!--END loadError-->
    <!--BEGIN loadError-->
    <div class="js_dialog" id="success" style="display: none;">
    <div class="weui-mask"></div>
    <div class="weui-dialog">
    <div class="weui-dialog__bd">报修信息,已经成功提交。请耐心等候...</div>
    <div class="weui-dialog__ft">
    <a href="wx_cusmenu.html"
    class="weui-dialog__btn weui-dialog__btn_primary">知道了</a>
    </div>
    </div>
    </div>
    <!--END loadError-->
    <!--BEGIN Error-->
    <div class="js_dialog" id="error" style="display: none;">
    <div class="weui-mask"></div>
    <div class="weui-dialog">
    <div class="weui-dialog__bd">系统错误。。。</div>
    <div class="weui-dialog__ft">
    <a href="javascript:;"
    class="weui-dialog__btn weui-dialog__btn_primary">知道了</a>
    </div>
    </div>
    </div>
    <!--END loadError-->
    <!--BEGIN Error-->
    <div class="js_dialog" id="TextError" style="display: none;">
    <div class="weui-mask"></div>
    <div class="weui-dialog">
    <div class="weui-dialog__bd">请填写文字描述。</div>
    <div class="weui-dialog__ft">
    <a href="javascript:;"
    class="weui-dialog__btn weui-dialog__btn_primary">知道了</a>
    </div>
    </div>
    </div>
    <!--END loadError-->
    <!--BEGIN Error-->
    <div class="js_dialog" id="PhotoError" style="display: none;">
    <div class="weui-mask"></div>
    <div class="weui-dialog">
    <div class="weui-dialog__bd">您没有上传图片,请上传图片。</div>
    <div class="weui-dialog__ft">
    <a href="javascript:;"
    class="weui-dialog__btn weui-dialog__btn_primary">知道了</a>
    </div>
    </div>
    </div>
    <!--END loadError-->
    <!--BEGIN Error-->
    <div class="js_dialog" id="textAndPhoto" style="display: none;">
    <div class="weui-mask"></div>
    <div class="weui-dialog">
    <div class="weui-dialog__bd">文字描述和图片为必填项,若是给你带来不便请见谅.</div>
    <div class="weui-dialog__ft">
    <a href="javascript:;"
    class="weui-dialog__btn weui-dialog__btn_primary">知道了</a>
    </div>
    </div>
    </div>
    <!--END loadError-->
    </div>
    <!-- 引用js 获取cookie值 -->
    <script src="js/wx_login.js"></script>
    <script src="WEIXIN/js/example.js"></script>
    <!-- 报修工单的提交 -->
    <script src="js/wx_repairTable.js"></script>
    <script>
    $(document).ready(function() {
    $('#dialogs').on('click', '.weui-dialog__btn', function(){
                $(this).parents('.js_dialog').fadeOut(200);
            });
    initSelectProject();//根据客户id 查询项目 里面调用了initSelectEquipment();//根据项目id 查询设备




    });
    </script>
    </body>
    </html>

    #######################

    JS(zepto.min.js跟jquery 差不多,不会的话,你就原生js写吧,我反正也不怎么会。js里有很多console.log()这样的语句,你觉得烦就先注释掉,或者你去看我上面的地址推荐。)

    (function($) {
      $.extend($.fn, {
        fileUpload: function(opts) {
          this.each(function(){
            var $self = $(this);
            var doms = {
              "fileToUpload": $self.find(".fileToUpload"),
              "thumb": $self.find(".thumb"),
              "progress": $self.find(".upload-progress")
            };
            var funs = {
              //选择文件,获取文件大小,也可以在这里获取文件格式,限制用户上传非要求格式的文件
              fileSelected: function() {
                var files = (doms.fileToUpload)[0].files;
                var count = files.length;
    //            console.log(files);
    //            console.log(count);
                
                for (var index = 0; index < count; index++) {
                  var file = files[index];
                  var fileSize = 0;
                  if (file.size > 1024 * 1024)
                    fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
                  else
                    fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';
               //   console.log(fileSize);
                }
                funs.uploadFile();
              },
              //异步上传文件
              uploadFile: function() {
                var fd = new FormData();//创建表单数据对象
                var files = (doms.fileToUpload)[0].files;
          //      console.log(files[0].name);
                $("#fileName").text(files[0].name);
                var count = files.length;
                for (var index = 0; index < count; index++) {
                  var file = files[index];
                  fd.append(opts.file, file);//将文件添加到表单数据中
                 // funs.previewImage(file);//上传前预览图片,也可以通过其他方法预览txt
                }
                var xhr = new XMLHttpRequest();
                xhr.upload.addEventListener("progress", funs.uploadProgress, false);//监听上传进度
                xhr.addEventListener("load", funs.uploadComplete, false);
                xhr.addEventListener("error", opts.uploadFailed, false);
                xhr.open("POST", opts.url);
                console.log(fd);
                xhr.send(fd);
              },
              uploadProgress: function(evt) {
    //        	  console.log("----------------------");
    //        	  console.log(evt);
    //        	  console.log(evt.lengthComputable);
                if (evt.lengthComputable) {
                  var percentComplete = Math.round(evt.loaded * 100 / evt.total);
                  //doms.progress.html(percentComplete.toString() + '%');
                  $("#qin_progress").css("width",percentComplete.toString() + '%');
                  
                }
              },
              uploadComplete: function(evt) {
            	console.log(evt);
                console.log(evt.target.responseText);
                var text=evt.target.responseText;
                var d = eval("(" + text + ")"); //把数据转成json
    			var mp4Url = d.fileVal;
    			console.log(mp4Url);
    			document.cookie = "mp4Url="+mp4Url;
    			
              }
            };
            doms.fileToUpload.on("change", function() {
              doms.progress.find("span").width("0");
              funs.fileSelected();
            });
          });
        }
      });
    })(Zepto);

    controller(我用的是JFinal框架)

    // 上传的视频
    	public void custVedioCon() {
    		// TODO Auto-generated method stub
    		String path = "custMp4";
    		// 获取上传的文件
    		UploadFile uf = getFile("myFile",path);//就是html设置的myFile
    		//System.out.println(uf);
    		//System.out.println(uf.getSaveDirectory());
    		// 拼接文件上传的完整路径
    		long mediaid = System.currentTimeMillis();
    		String rename  = mediaid +"."+FileHelper.getExtName(uf.getFileName());
    		boolean bRet  = FileHelper.renameFile(uf.getSaveDirectory(), uf.getFileName(),rename);
    		String fileName = "uploads/"+path+"/"+uf.getFileName();
    		if(bRet)
    		{
    			fileName = "uploads/"+path+"/"+rename;
    		}
    		//System.out.println("vediopahh="+fileName);
    		this.setAttr("fileVal", fileName);
    		System.out.println(fileName);
    		//System.out.println(mediaid);
    		//this.setAttr("file", mediaid);
    		
    		//以json格式进行渲染
    		this.renderJson();
    		
    	}
    	

    我写的可能很乱,我也是知道的。慢慢来吧







    展开全文
  • 拍照 文件上传 录像 监控
  • 安卓系统间实时视频传输.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 根据网上几十个例子改编整理的,实现了拍照上传 录像上传 本地文件上传,客户端 服务端代码都有,jar包也一块打包了,要用到的只需要改一下封装类中的URL就行,做了一周,2分算是辛苦分啦
  • SAP 批量上传数据 CATT抓屏录像 SAP 批量上传数据 CATT抓屏录像
  • Android录像上传回显服务器系统开发.pdf
  • 调用系统相机录像.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 手机拍照 录像 上传

    2018-01-15 17:07:46
    alert("只允许上传jpg、png、bmp、jpeg格式的图片"); return false; } //以图片宽度为800进行压缩  lrz(file_path, { width : 800 }).then(function(rst) { //imgHead.style.filter = "progid...

        坚持发文章也是件难事,今天快下班了,抽出点时间,再发点东西。利人利己。 主要发前端代码,后端比较好写。                js代码:     

     // 扩展API加载完毕后调用onPlusReady回调函数 

    document.addEventListener("plusready", onPlusReady, false);
    // 扩展API加载完毕,现在可以正常调用扩展API 
    function onPlusReady() {
    console.log("plusready");
    }
    var cmr = null;
    var dataURL = null;
    var resourcess = null;
    function upup(filepath) {
    var task = plus.uploader.createUpload(
    url, {},
    function(t, status) {
    // 上传完成
    if (status == 200) {
    resourcess += ","+t.ress;
    alert(JSON.stringify(t.ress));
    alert("视频上传成功!");
    } else {
    alert("视频上传失败!");
    }
    });

    task.addFile(filepath, {
    key : 'fileUpload'
    });
    task.start();
    }

    function fileChange2(that) {
    var file_path = that.files[0];
    upup(file_path);
    }
    // 录像
    function videoCapture() {
    cmr = new plus.camera.getCamera();
    var res = cmr.supportedVideoResolutions[0];
    var fmt = cmr.supportedVideoFormats[0];
    var filepath = "";
    console.log("Resolution: " + res + ", Format: " + fmt);
    cmr.startVideoCapture(function(path) {
    new plus.io.resolveLocalFileSystemURL(path,
    function(entry) {
    filepath = entry.toLocalURL();
    upup(filepath);
    }, function(e) {
    outLine("读取视频文件错误:" + e.message);
    });


    }, function(error) {
    alert("录像失败信息: " + error.message);
    }, {
    resolution : res,
    format : fmt
    });
    // 拍摄10s后自动关闭 
    setTimeout(stopCapture, 10000);
    }
    // 停止录像
    function stopCapture() {
    console.log("stopCapture");
    cmr.stopVideoCapture();
    }


    var imgid = "";
    //上传弹窗
    function captureImagell(file_path, filepath) {
    $("#picture").hide();

    if (filepath == "") {
    return;
    }
    var extStart = filepath.lastIndexOf(".");
    var ext = filepath.substring(extStart, filepath.length)
    .toUpperCase();
    if (".jpg|.png|.bmp|.jpeg".toUpperCase().indexOf(
    ext.toUpperCase()) == -1) {
    alert("只允许上传jpg、png、bmp、jpeg格式的图片");
    return false;
    }
    //以图片宽度为800进行压缩  
    lrz(file_path, {
    width : 800
    }).then(function(rst) {
    //imgHead.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='image',src=\"" + filepath + "\")";
    // 设置img的src为base64编码的透明图片 取消显示浏览器默认图片
    //imgHead.src = rst;
    //压缩后异步上传  
    $.ajax({
    url : url ,
    type : "POST",
    data : {
    imgdata : rst.base64

    //压缩后的base值  
    },
    dataType : "json",
    cache : false,
    async : false,
    success : function(data) {
    if (data.success) {
    alert(JSON.stringify(data));///data.message为上传成功后的文件路径  
    imgid = data.data.id;
    resourcess +=","+record;
    alert(imgid);
    $("#imghead").attr('src', rst.base64);


    } else {
    alert(data.success);///data.message为上传失败原因  
    }


    },
    error : function() {
    alert("上传失败");
    }
    });
    });
    }
    function fileChange(that) {
    var filepath = $(that).val();
    var file_path = that.files[0];
    captureImagell(file_path, filepath);
    }
    // 拍照
    function captureImage() {
    var cmr = new plus.camera.getCamera();
    var res = cmr.supportedImageResolutions[0];
    var fmt = cmr.supportedImageFormats[0];
    var file_path = "";
    console.log("Resolution: " + res + ", Format: " + fmt);
    var filepath = null;


    cmr.captureImage(function(path) {
    filepath = path.split("/")[1];
    plus.io.resolveLocalFileSystemURL(path, function(entry) {
    file_path = entry.toLocalURL();
    captureImagell(file_path, filepath);
    }, function(e) {
    outLine("读取拍照文件错误:" + e.message);
    });
    }, function(error) {
    alert("Capture image failed: " + error.message);
    }, {
    resolution : res,
    format : fmt
    });

    }

    html 主要代码:

                                  <div>
    对设备拍照上传照片: <img id="imghead" src="img/wo.png"
    style="width: 100px; height: 100px;" />
    <a href="#picture"
    class="mui-btn mui-btn-primary mui-btn-block mui-btn-outlined"
    style="padding: 5px 20px;">上传</a>
    </div>

                                       <div>
    现在录象: <a href="#picture2"
    class="mui-btn mui-btn-primary mui-btn-block mui-btn-outlined"
    style="padding: 5px 20px;">开始录制</a>
    </div>

    。。。

    <div id="picture"
    class="mui-popover mui-popover-action mui-popover-bottom">
    <ul class="mui-table-view">
    <li class="mui-table-view-cell"><a οnclick="captureImage()">拍照</a></li>
    <li class="mui-table-view-cell"><a class="a-file"
    href="javascript:void(0)" type="file" data-role="none" οnclick="selectFile()">相册</a> <input
    class="hidden" type="file" accept="image/*" capture="camera"
    οnchange="fileChange(this)" id="payfile" name="myfile"
    data-role="none"></input>

    </ul>
    <form id="uploadfiles" enctype="multipart/form-data">
    <input type="hidden" name="userId" value="0"></input>
    </form>
    <ul class="mui-table-view">
    <li class="mui-table-view-cell"><a href="#picture"><b>取消</b></a>
    </li>
    </ul>
    </div>
    <div id="picture2"
    class="mui-popover mui-popover-action mui-popover-bottom">
    <ul class="mui-table-view">
    <li class="mui-table-view-cell"><a οnclick="videoCapture()">录制</a></li>
    <li class="mui-table-view-cell"><a class="a-file"
    href="javascript:void(0)" type="file" data-role="none" οnclick="selectFile2()">从媒体库中选择</a>
    <input class="hidden" type="file" accept="video/*"
    capture="camcorder" οnchange="fileChange2(this)" id="payfile2"
    name="myfile2" data-role="none"></input>
    </ul>
    <form id="uploadfiles" enctype="multipart/form-data">
    <input type="hidden" name="userId" value="0"></input>
    </form>
    <ul class="mui-table-view">
    <li class="mui-table-view-cell"><a href="#picture"><b>取消</b></a>
    </li>
    </ul>
    </div>

    。。。

    <div class="footer">
    <div id="picture"
    class="mui-popover mui-popover-action mui-popover-bottom">
    <ul class="mui-table-view">
    <li class="mui-table-view-cell"><a οnclick="captureImage()">拍照</a></li>
    <li class="mui-table-view-cell"><a class="a-file"
    href="javascript:void(0)" type="file" data-role="none" οnclick="selectFile()">相册</a> <input
    class="hidden" type="file" accept="image/*" capture="camera"
    οnchange="fileChange(this)" id="payfile" name="myfile"
    data-role="none"></input>

    </ul>
    <form id="uploadfiles" enctype="multipart/form-data">
    <input type="hidden" name="userId" value="0"></input>
    </form>
    <ul class="mui-table-view">
    <li class="mui-table-view-cell"><a href="#picture"><b>取消</b></a>
    </li>
    </ul>
    </div>
    <div id="picture2"
    class="mui-popover mui-popover-action mui-popover-bottom">
    <ul class="mui-table-view">
    <li class="mui-table-view-cell"><a οnclick="videoCapture()">录制</a></li>
    <li class="mui-table-view-cell"><a class="a-file"
    href="javascript:void(0)" type="file" data-role="none" οnclick="selectFile2()">从媒体库中选择</a>
    <input class="hidden" type="file" accept="video/*"
    capture="camcorder" οnchange="fileChange2(this)" id="payfile2"
    name="myfile2" data-role="none"></input>
    </ul>
    <form id="uploadfiles" enctype="multipart/form-data">
    <input type="hidden" name="userId" value="0"></input>
    </form>
    <ul class="mui-table-view">
    <li class="mui-table-view-cell"><a href="#picture"><b>取消</b></a>
    </li>
    </ul>
    </div>
    </div>

    快下班了,就弄到这里吧!!!







    展开全文
  • 拍照上传源码.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 图片拍照上传.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 安卓图片上传和文件上传带jsp服务端源码.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • android录音上传到服务器,上传使用AsyncTask异步任务.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • android:录像加列表显示 .zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • Camera2一边录像,一边拍照.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 转载自H5通过WebView录像上传 前面的博文《Android开发笔记(一百五十二)H5通过WebView上传图片》介绍了如何拍照上传给网页,不料客户又要求再加个摄像上传给网页。既然如此,那么再探讨一下如何实现这个摄像上传...

    转载自H5通过WebView录像上传

    前面的博文《 Android开发笔记(一百五十二)H5通过WebView上传图片》介绍了如何拍照上传给网页,不料客户又要求再加个摄像上传给网页。既然如此,那么再探讨一下如何实现这个摄像上传的功能。

    与拍照上传一样,摄像上传也要重写WebChromeClient的openFileChooser/onShowFileChooser方法,在这两个方法内部跳转到系统的摄像机页面,示例代码如下:
    
      
    1.     private static ValueCallback<Uri> mUploadMessage;
    2.     private static ValueCallback<Uri[]> mUploadMessageLollipop;
    3.     
    4.     private class MyWebChromeClient extends WebChromeClient {
    5.         // Android 4.*
    6.         public void openFileChooser(ValueCallback<Uri> uploadMsg,
    7.                 String acceptType, String capture) {
    8.             Log.d(TAG, "openFileChooser 4.1");
    9.             mUploadMessage = uploadMsg;
    10.             recordVideo();
    11.         }
    12.         // Android 5.0+
    13.         @Override
    14.         public boolean onShowFileChooser(WebView webView,
    15.                 ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
    16.             Log.d(TAG, "openFileChooser 5.0+");
    17.             mUploadMessageLollipop = filePathCallback;
    18.             recordVideo();
    19.             return true;
    20.         }
    21.     }
    22.     private final static int VIDEO_REQUEST = 120;
    23.     private void recordVideo() {
    24.         Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    25.         //设置视频质量
    26.         intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
    27.         //设置视频时长
    28.         intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);
    29.         //开启摄像机
    30.         startActivityForResult(intent, VIDEO_REQUEST);
    31.     }
    在摄像机页面录像结束,返回到上一页时回调onActivityResult方法,所以需要重写上个页面的onActivityResult方法,在该方法中把摄像结果传给h5网页。下面是回传视频的处理代码:
    
      
    1.     @Override
    2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    3.         super.onActivityResult(requestCode, resultCode, data);
    4.         Log.d(TAG, "onActivityResult requestCode="+requestCode);
    5.         if (requestCode == VIDEO_REQUEST) {
    6.             if ( null == mUploadMessage && null == mUploadMessageLollipop) {
    7.                 return;
    8.             }
    9.             Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
    10.             Log.d(TAG, "onActivityResult path="+result.getPath());
    11.             if (mUploadMessageLollipop != null) {
    12.                 if (resultCode == RESULT_OK) {
    13.                     mUploadMessageLollipop.onReceiveValue( new Uri[]{result});
    14.                     mUploadMessageLollipop = null;
    15.                 } else {
    16.                     mUploadMessageLollipop.onReceiveValue( new Uri[]{});
    17.                     mUploadMessageLollipop = null;
    18.                 }
    19.             } else if (mUploadMessage != null) {
    20.                 if (resultCode == RESULT_OK) {
    21.                     mUploadMessage.onReceiveValue(result);
    22.                     mUploadMessage = null;
    23.                 } else {
    24.                     mUploadMessage.onReceiveValue(Uri.EMPTY);
    25.                     mUploadMessage = null;
    26.                 }
    27.             }
    28.         }
    29.     }

    上面代码应该是完成摄像上传了,但是要怎样验证是否上传成功呢?当然是在当前网页直接观看网页已上传的视频,如果网页都能正常播放视频,说明这个摄像视频的的确确是成功上传了。让WebView支持观看网页视频的话,得进行以下的WebSettings设置操作,相关的设置代码如下所示:
    
      
    1.     private void initSetting() {
    2.         WebSettings webSettings = webView.getSettings();
    3.         webSettings.setJavaScriptEnabled( true);
    4.         webSettings.setPluginState(WebSettings.PluginState.ON);
    5.         webSettings.setUseWideViewPort( true); // 支持HTML的“viewport”标签或者使用wide viewport
    6.         webSettings.setAllowFileAccess( true); // 允许访问文件
    7.         webSettings.setSupportZoom( true); // 支持缩放
    8.         webSettings.setLoadWithOverviewMode( true);
    9.         webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 不加载缓存内容
    10.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    11.             webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
    12.         }
    13.         webSettings.setDomStorageEnabled( true);
    14.     }

    最后通过演示界面截图,观察一下摄像上传的完整流程。一开始打开WebView所在的页面,此时显示初始网页如下图所示:


    点击红色按钮,跳到系统的摄像机页面,摄像结束后返回当前页面,此时网页下方出现了一个视频占位图标,如下图所示:


    点击占位图标上的三角符号,则网页开始播放已上传的摄像视频,下面的图片正是播放过程中的截图:



    展开全文
  • 调用Android手机摄像头无线循环录像.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • html5视频前端视频上传,手机拍照上传,手机录像上传。HLMT5中input实现多种文件上传,视频上传,图片上传,调用手机摄像头,照相机,相册等功能。
  • 上传 const fd = new FormData()  fd.append( 'file ' , file) ocrIdCard(fd).then(response => { if (response) { console.log(response) } }). catch (() => { }) } } }   转载于...
  • android拍摄视频并上传到PHP服务器.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 前面的博文《Android开发笔记(一百五十二)H5通过WebView上传图片》介绍了如何拍照上传给网页,不料客户又要求再加个摄像上传给网页。既然如此,那么再探讨一下如何实现这个摄像上传的功能。与拍照上传一样,摄像...
  • android 使用javacv进行录像[模仿vine].zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • java语言写的android照相机,有wifi实时传输功能,内含源代码以及apk文件.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 在之前的项目中遇上移动端微信h5页面上传用户录像的功能需求,在简单使用input type=file的时候发现,ios录像上传会做自动压缩,而安卓端会直接上传录制的原视频,在用户不主动设置降低分辨率的情况下导致录像体积...
  • webm 屏幕录像机和自动上传器合二为一:D 概述: NyaaSnap 是一个小型的 webm 屏幕录像机,可用于制作快速的小视频片段以供共享,并且具有 pomf.se 的内置上传选项。 它并不意味着录制大型录音,将其视为高质量的 ...
  • 实现录音的AAC格式,并上传到服务器,然后下载播放.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 同时,在视频文件上传方面,我们也增加了新功能,即定时将最新的录像文件上传到文件服务器。 该功能主要是为了实现分布式转码服务器而存在,每个转码服务器必须获取到最新的录像文件,如果通过后端一一向每个...
  • 手机拍照.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,477
精华内容 3,390
关键字:

录像实时上传