精华内容
下载资源
问答
  • Python语言的特点有哪些Python 是目前最...Python 语言主要有以下特点:1) 简单:Python 是一种代表简单主义思想的语言。阅读一个良好的 Python 程序就感觉像是在读英语一样,尽管这个英语的要求非常严格。Python ...

    Python语言的特点有哪些

    Python 是目前最流行的语言之一,从云计算、大数据到人工智能,Python 无处不在,Python 人才需求量也在逐年攀升,Python 为何能发展如此的迅猛,究竟有什么特点呢?

    Python 语言主要有以下特点:

    1) 简单:Python 是一种代表简单主义思想的语言。阅读一个良好的 Python 程序就感觉像是在读英语一样,尽管这个英语的要求非常严格。Python 的这种伪代码本质是其优点之一,使用户能够专注于解决问题而不是去搞明白语言本身。

    2) 易学:Python 有极其简单的语法,非常容易上手。

    3) 免费、开源:Python 是 FLOSS(自由/开源软件)之一。简单来说,用户可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS 是基于一个团体分享知识的概念,这也是为什么 Python 如此优秀的原因之一:它由一群希望看到 Python 更加优秀的人创造,并被他们不断改进。

    4) 高层语言:使用 Python 语言编写程序时,不用考虑如何管理程序使用的内存等底层细节。

    5) 可移植性强:由于它的开源本质,Python 已经被移植在许多平台上。如果 Python 程序没有使用依赖于系统的特性,那么程序不用修改就可以在下述任意平台上面运行。这些平台包括 Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE、Pocket PC 和 Symbian。

    6) 解释型语言:编译型语言(如 C 或 C++)源程序从源文件(即 C 或 C++ 语言)转换到二进制代码(即 0 和 1)的过程通过编译器和不同的标记、选项完成,当运行程序的时候,连接器把程序从硬盘复制到内存中并且运行。而 Python 程序不需要编译成二进制代码,直接从源代码运行程序。

    在计算机内部,Python 解释器把源代码转换成字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。因此,用户不再需要操心如何编译程序、如何确保指定了正确的模块或包文件等细节,所有这一切使得使用 Python 更加简单。同时,由于只需要把 Python 程序拷贝到另外一台计算机上即可工作,这也使得 Python 程序更加易于移植。

    7) 面向对象:Python 既支持面向过程的编程也支持面向对象的编程。在面向过程的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在面向对象的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他语言(如 C++ 和 Java)相比,Python 以一种非常强大又简单的方式实现面向对象编程。

    8) 可扩展性强:如果希望把一段关键代码运行得更快或希望某些算法不公开,可以使用 C 或 C++ 语言编写这部分程序,然后在 Python 程序中调用它们。

    9) 可嵌入性强:可以把 Python 嵌入 C/C++ 程序,从而向用户提供脚本功能。

    10) 丰富的扩展库:Python 扩展库很庞大,可以帮助处理包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV 文件、密码系统、GUI(图形用户界面)、Tk 以及其他与系统有关的操作。只要安装了 Python,所有这些功能都是可用的,这被称作 Python 的“功能齐全”理念。除了扩展库以外,还有许多其他高质量的库,如 wxPython、Twisted 和 Python 图像库等。

    编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

    通俗易懂,深入浅出,一篇文章只讲一个知识点。

    文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

    文章不涉及代码,不烧脑细胞,人人都可以学习。

    当你决定关注「编程帮」,你已然超越了90%的程序员!

    erweima_biancheng.gif?v=1.6.43

    微信扫描二维码关注

    展开全文
  • HTML5 Plus移动App(5+App)开发入门指南

    万次阅读 2016-06-29 16:40:43
    HTML5 Plus移动App,简称5+App,是一种基于HTML、JS、CSS编写的运行于手机端的App,这种App可以通过扩展的JS API任意调用手机的原生能力,实现与原生App同样强大的功能和性能。 HTML5 Plus规范 通过HTML5开发移动...

    HTML5 Plus应用概述

    HTML5 Plus移动App,简称5+App,是一种基于HTML、JS、CSS编写的运行于手机端的App,这种App可以通过扩展的JS API任意调用手机的原生能力,实现与原生App同样强大的功能和性能。

    HTML5 Plus规范

    通过HTML5开发移动App时,会发现HTML5很多能力不具备。为弥补HTML5能力的不足,在W3C中国的指导下成立了www.html5plus.org组织,推出HTML5+规范。
    HTML5+规范是一个开放规范,允许三方浏览器厂商或其他手机runtime制造商实现。
    HTML5+扩展了JavaScript对象plus,使得js可以调用各种浏览器无法实现或实现不佳的系统能力,设备能力如摄像头、陀螺仪、文件系统等,业务能力如上传下载、二维码、地图、支付、语音输入、消息推送等。
    HBuilder的手机原生能力调用分2个层面:
    - 跨手机平台的能力调用都在HTML5+规范里,比如二维码、语音输入,使用plus.barcode和plus.speech。编写一次,可跨平台运行。
    - Native.js是另一项创新技术。手机OS的原生API有四十多万,大量的API无法被HTML5使用。Native.js把几十万原生API封装成了js对象,通过js可以直接调ios和android的原生API。这部分就不再跨平台,写法分别是plus.ios和plus.android,比如调ios game center,或在android手机桌面创建快捷方式。
    Native.js的用法示例,var obj= plus.android.import("android.content.Intent");,将一个原生对象android.content.Intent映射为js对象obj,然后在js里操作obj对象的方法属性就可以了。
    Native.js的详细教程可以参考:5+ App开发Native.js入门指南

    HTML5+ App

    使用HTML5+开发的移动App并非mobile web页面。这是新手最容易混淆的地方。mobile web的文件存放在web服务器上,而移动App的文件存放在手机本地,编写移动App的html、js、css文件被打包到ipa或apk等原生安装包,在手机客户端运行。
    用个更形象的列子,web app仍然是b/s结构,而移动App是c/s结构甚至是完全脱线的单机应用。
    这或许有点超过一些人的想象,他们认为HTML就是web、就是b/s,事实上javascript早已可通过nodejs等技术运行在服务器侧,而在HBuilder的移动App里,HTML、JS等文件也可以被打包成原生安装包。
    当然这些移动App里某些页面也可以继续从服务器端以网页方式下行,就像任何原生应用(如微信)都可以内嵌网页一样。
    所以mobile web,在HBuilder里新建项目时,属于web项目。不要放置到移动App项目下。mobile web项目也不能真机联调和打包。
    举几个例子说明mobile web和移动App的区别。
    例1:把一个mobile web项目,打包成移动App。
    1. 在HBuilder里新建一个web项目,把mobile web代码放进去。
    2. 在HBuilder里新建移动App
    3. 在新建的移动App下找到manifest.json,将其中的入口页面配置为mobile web的网络地址。
    4. 然后点发行打包,就得到一个移动App的安装包。除了有个安装包和桌面有个快捷方式外,与浏览器的体验不会有其他区别。
    5. 不过注意,这样的移动App体验很差,它在页面跳转时会像浏览器那样切换并且白屏,它完全无法脱线使用,没有网络时点开这个app只能看到一片白板。这样的app在Apple的Appstore审核时是无法通过的,其他大的安卓市场也不会允许发行。

    例子2:正规的移动App
    1. 在HBuilder里新建移动App项目
    2. 在移动App里编写html、Js、css文件,本地js通过ajax方式请求服务器数据,通过plus.net对象避开跨域限制
    3. 移动App里的js可以通过plus对象调用手机原生能力
    4. 编写好的移动App点打包变成安装包,这才是一个体验良好的、可上线的移动App。

    例子3:混合型移动App
    这里的混合型移动App,所指并非是原生和HTML5的hybrid App,而是指一部分页面是本地的HTML,通过ajax与服务器交互,另一部分页面是从服务器下行的mobile web页面。
    1. 分别新建一个web项目和一个移动App项目
    2. 在移动App里的某个html里通过<a href= 或者location.href=或者webview对象的loadURL方法指定mobile web的页面地址。
    3. 在服务器下行的mobile web页面中,一样可以通过js调用本地HTML5Plus api对硬件层进行访问。类似微信JS SDK。

    HTML5+ 应用架构

    HTML5+ 应用架构图

    HTML5+ 规范 API 及demo示例

    最新规范请参考http://www.html5plus.org/#specification
    手机端体验各个API的实现效果,ios手机在Appstore搜索Hello H5+,Android手机下载地址
    在HBuilder中新建移动App,选Hello H5+,即可看到这个demo的源代码。

    开发环境HBuilder

    HBuilder内置HTML5+ APP开发环境,提供一套完整的移动应用开发解决方案。内置HTML5+ API语法提示,提高开发效率;集成真机运行环境,方便开发后即时在真机上查看运行效果;集成应用云端打包系统,不用部署xcode和Android sdk就可以打包应用。使开发者只需要使用HTML5、Javascript、CSS技术就可以快速开发跨平台的移动应用。
    下载地址:http://www.dcloud.io/

    平台支持


    • iOS 5.0及以上
    • Android 2.3及以上

    手把手教你开发HelloWord

    创建HelloWord应用


    • 启动HBuilder(下载地址:http://www.dcloud.io/);
    • 在菜单栏中选择“文件”-> “新建”->“移动App”(快捷键Ctrl+N A),打开“创建移动App”对话框,在应用名称中输入“HelloWorld”;
      注意新建移动App需要联网分配一个appid,在真机联调、打包发行时都需要这个ID,所以不联网无法创建移动App。
      创建移动App图
    • 创建完成后,会在项目管理器中显示新建的“HelloWorld”项目
      创建移动App完成图

    manifest.json

    在项目管理器中双击“manifest.json”文件,打开应用配置页面:
    manifest.json配置图
    对于要打包的原生应用而言,其各种配置均在此处。具体配置教程见:Manifest.json文件配置,或者点击配置页面上的“manifest文件配置指南”链接。

    调用HTML5+ API

    在项目管理器中双击“index.html”文件(快捷键Ctrl+T 然后输入in选择文件回车),对于HTML5+应用的页面有一个很重要的“plusready”事件,此事件会在页面加载后自动触发,表示所有HTML5+ API可以使用,在此事件触发之前不能调用HTML5+ API,所以应该在此事件回调函数中调用页面初始化需要调用的HTML5+ API,而不应该在onload或DOMContentLoaded事件中调用:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8"/>
        <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
        <title>Hello world</title>
        <script type="text/javascript"> 
    // 扩展API是否准备好,如果没有则监听“plusready"事件
    if(window.plus){
        plusReady();
    }else{ 
        document.addEventListener( "plusready", plusReady, false );
    }
    // 扩展API准备完成后要执行的操作
    function plusReady(){
        var ws = plus.webview.currentWebview(); //pw回车可输出plus.webview
        // ... code
    }
        </script> 
    </head> 
    <body>
    </body>
    </html>
    

    编辑程序启动后默认显示的页面index.html,在页面中添加一个按钮,点击后将打开新页面加载“<http://m.csdn.net/>”,为了实现此功能,我们需要用到HTML5+扩展API中plus.webview.createWebview()方法创建窗口:
    创建index.html图
    编辑完成后,按Ctrl+S键保存。

    真机运行 run in device

    写完代码后,我们可以通过真机运行来查看效果。真机运行有3个特点:
    1. 真实。虽然PC端HBuilder的边改边看也可以看大致的页面,但真实的布局效果以及手机上的特殊能力调用,还是必须在真机测试。
    2. 边改边看。在HBuilder更改页面并保存后,可立即同步在真机上看到保存后的显示效果。比开发原生应用还方便。
    3. 检查错误和log。手机运行HTML等文件时如果发生错误以及打印的console.log,都可以在真机运行时从手机端反馈回到HBuilder的控制台,在控制台直接查看。
    注意只有移动App项目才可以真机联调。

    在HBuilder的“项目管理器”中选择创建的“HelloWorld”应用。

    启动真机运行

    将iOS或Android设备连接到电脑,这时HBuilder会自动检测连接到电脑上的设备,通过菜单栏中的“运行”菜单启动:
    通过菜单启动Android真机运行图
    也可通过工具栏启动:
    通过工具栏启动Android真机运行图

    启动真机运行后,在控制台中显示以下信息:
    Android真机运行日志图
    注:如果提示错误信息,请尝试“终止”后重新启动真机运行!

    启动后会弹出提示框,选择“确定”,显示以下页面:
    手机端App运行后截图
    点击按钮后截图

    在Android设备会自动安装并启动HBuilder调试基座,iOS设备需要开发者手动点击手机桌面的HBuilder调试App。
    Android HBuilder应用图
    注意:真机联调App时,提供的是一个测试环境,并不真实发生打包,调试基座App的名字、图标、启动封面图片、是否可旋转这些只有打包才能更改的属性不会因为开发者修改manifest文件而变化。只有修改manifest且点击菜单发行-打包后,上述4个设置才能更改。

    运行后,HBuilder中修改页面代码,保存后会自动同步到手机中,如果手机当前展示着被修改的页面,则会刷新页面。
    尝试在js中在plus ready之后编写console.log,或者改写错误的js,可以直接在HBuilder的控制台看到结果。
    如果真机运行遇到各种故障,请点击运行菜单里的真机运行常见故障指南。

    debug调试

    除了真机运行,我们还可以利用chrome和safari的开发者控制台来调试5+App。
    可以使用真机插上数据线,也可以使用模拟器。所有Api包括plus的各种api,甚至包括plus.ios和plus.android的原生对象,都可以调试。
    在HBuilder的菜单运行-手机运行里有教程的链接。
    但他们也有局限性,chrome调试需要使用Android4.4以上的设备并且要翻墙,safari调试需要使用mac电脑。

    发行打包

    完成应用页面的编辑后,需要正式打包为原生的apk或ipa安装包。
    首先明确一下,有人说HTML5做的应用无法通过苹果Appstore审核,这是错误的说法。苹果只是拒绝开发者把web站点直接打包上Appstore,它认为这是给Appstore制造垃圾应用,如果是原生体验的App,虽然使用HTML5技术,苹果也不会拒绝上架。事实上Appstore上使用HTML5技术的App超过20w。
    HBuilder提供的打包有云打包和本地打包两种。
    HBuilder并不会向开发者收取任何有关打包的费用,也不限制开发者使用本地打包。
    云打包的特点是DCloud官方配置好了原生的打包环境,可以把HTML等文件编译为原生安装包。
    1. 对于不熟悉原生开发的前端工程师,云打包大幅降低了他们的使用门槛。
    2. 对于没有mac电脑的开发者,他们也可以通过云打包直接打出iOS的ipa包。
    无论云打包还是本地打包,都在HBuilder的菜单-发行中。
    本地打包在该菜单下有详细教程,此处仅对云打包进行说明。

    通过菜单栏中的“发行”->“App打包”,打开“App云端打包”对话框提交。
    注意只有移动App项目才可以打包。

    iOS发布

    对于iOS平台,可以选择越狱包或正式包(Appstore专用或企业证书),前者只能安装在已越狱的设备上,后者则可通过iDP证书打包提交到Appstore发布、或通过iEP证书打包在企业内部发布。

    配置打包信息


    • 越狱包
      iOS App云端打越狱包
      AppID:iOS应用标识,推荐使用反向域名风格的字符串,如“com.domainname.appname”。
    • 正式包
      iOS App云端打正式包
      AppID:iOS应用标识,推荐使用反向域名风格的字符串,如“com.domainname.appname”,必须与profile文件绑定的App ID匹配。
      私钥证书:iOS Certificates文件(.p12);
      私钥密码:导入私钥证书的密码;
      Profile文件:iOS Provisioning Profile文件(.mobileprovision),必须与苹果App ID和私钥证书区配;
      证书生成请参考http://ask.dcloud.net.cn/article/152

    查看打包状态

    通过菜单栏中的“发行”->“查看打包状态”,打开“查看App打包状态”对话框,可查看打包历史记录和状态:
    iOS 查看打包状态
    如果“制作状态”栏显示“打包成功,下载完成”则表示云端打包完成,可点击“打开下载目录”查看下载的安装包。

    Android发布

    对于Android平台,可以选择使用DCloud生成的公用证书或自己生成的证书,两者不影响安装包的发布,唯一的差别就是证书中开发者和企业信息不同。

    生成Android签名证书

    使用DCloud公用证书可忽略此操作)确保电脑上安装了JRE,我们将使用JRE自带的创建和管理数字证书的工具Keytool。使用以下命令生成证书:
    Android生成签名证书


    • keystorehelloworld.keystore 表示生成的证书,可以加上路径(默认在用户主目录下);
    • aliashelloworld 表示证书的别名是helloworld;
    • keyalgRSA 表示采用的RSA算法;
    • validity10000 表示证书的有效期是10000天。

    配置打包信息


    • 使用DCloud公用证书
      Android 使用DCloud公用证书打包
      App包名:Android应用包名,使用反向域名风格的字符串,如“com.domainname.appname”。
    • 使用自有证书
      Android 使用自用证书打包
      App包名:Android应用包名,推荐使用反向域名风格的字符串,如“com.domainname.appname”;
      证书别名:生成证书时使用-alias参数设置的证书别名;
      私钥密码:生成证书时使用的keystore密码;
      证书文件:生成证书时使用-keystore参数设置的证书保存路径;

    查看打包状态

    通过菜单栏中的“发行”->“查看打包状态”,打开“查看App打包状态”对话框,可查看打包历史记录和状态:
    Android 查看打包状态
    如果“制作状态”栏显示“打包成功,下载完成”则表示云端打包完成,可点击“打开下载目录”查看下载的安装包。

    已经打好的安装包,允许开发者在2天内继续下载。2天后服务器端会清除文件。

    遇到打包失败,常见原因是:
    如果使用自用证书,很可能是证书配置错误。
    如果使用DCloud证书仍然出错,很可能是图片错误。所有图片格式必须是标准png,且严格符合分辨率要求。使用其他图片格式重命名为png会导致打包失败!
    其他错误请参考: 云打包常见错误排查指南

    UI框架

    HBuilder并不限制UI框架,开发者使用任何UI框架均可以。
    不过市面上确实没有什么好的手机App前端框架,DCloud开发了mui框架,它的性能更高,样式也更接近原生App,并且mui调用了HTML5+扩展能力,可以实现更好的体验。
    我们强烈推荐开发移动App的开发者使用mui框架,详情请参考文档中心mui章节
    请注意,mui只封装了部分HTML5Plus Api,学会mui框架不代表可以不学习HTML5Plus规范。mui不会做的很重,只是很有限的通过封装简化了常见开发过程。

    开发资源

    API手册HTML5+规范

    HelloH5+示例应用,应用中包括几乎所有plus API的示例:
    - iOS:Appstore中搜索Hello H5+
    - Android:下载地址

    HelloH5二维码图片
    获取Hello H5+的源代码,在HBuilder中新建移动App,选Hello H5+。可以查看所有plus api的调用样例代码。

    Hello mui示例应用,漂亮且高性能的前端UI框架:
    下载页面

    进阶教程

    如果想开发出接近原生体验的App,请访问如下教程:
    提升HTML5的性能体验系列之一 避免切页白屏
    提升HTML5的性能体验系列之二 列表流畅滑动
    提升HTML5的性能体验系列之三 流畅下拉刷新
    提升HTML5的性能体验系列之四 使用原生UI(nativeUI)

    展开全文
  • 当今信息社会,信息就是金钱,而但凡是信息便必然承载着时效性,过时的信息将具有任何价值。由此可见,信息实时性的重要性。 随着近几年物联网在各行各业的迅猛发展,越来越多的终端设备连入网络,实现远程交互...

    ※已刊登在《无线电》04月刊上   搭建属于你的在线实时采集系统

    ——HTML5 在嵌入式系统中的应用


    作者:刘琛,徐洋

    摘要: 本应用摆脱了以往嵌入式系统的数据采集方式,借助于最新的HTML5的Canvas API及WebSocket API两大特性,实现了数据的在线实时采集功能。提升了嵌入式采集系统的性能及体验。为嵌入式开发工作者提供参考。

    关键字:HTML5;HTTP Server;Canvas;WebSocket;W5500;实时;采集系统;

        当今信息社会,信息就是金钱,而但凡是信息便必然承载着时效性,过时的信息将不具有任何价值。由此可见,信息实时性的重要性。

        随着近几年物联网在各行各业的迅猛发展,越来越多的终端设备连入网络,实现远程交互及控制;各式传感器的广泛普及,使得数据节点分布越来越多。而这些交互数据本身也属于一种原始信息,这些数据量需要我们采集、分析、处理、反馈,其数据真实有效性,准确性,以及实时性保证了整个工作的效率,质量以及价值。

        在此,我们基于W5500实现了一个在线采集系统,并且为其引入了一个新鲜的元素——HTML5。通过这种最新的Web语言,为大家呈现一种更为实时、高效的在线实时采集系统。相信随着HTML5在嵌入式领域的不断深入推广,必然对产业效能及价值提升产生不小的作用。

        在具体介绍这种实时采集系统前,让我们先简单的来认识一下HTML5。

    HTML5和HTML的区别

        HTML为创建网页Web使之能够在网络浏览器呈现而设计的一种标记语言。

        HTML5为HTML的下一个修订版本。而广义的HTML5,包括了新的以及增强的HTML,CSS3,JavaScript API和事件的一套技术组合。

    HTML5-1

    图1HTML5 Logo

    以下为HTML5较HTML新增强的主要功能:

    • 提高优化网页元素;
    • 表单;
    • Canvas绘图;
    • 网页套接字(WebSocket)
    • 本地存储;
    • 页面间信息传输;
    • 视频与音频(定时媒体播放);
    • 地理位置(Communication APIs);
    • 微数据;

    Canvas API及Web Socket API

        其实,实现该在线实时采集系统,得益于HTML5新增的2个API函数:Canvas及WebSocket。

        Canvas,由04年苹果公司为MAC OS X仪表板开发的像素绘图元素发展而来。由Canvas元素和相应的JavaScript组成。使得开发者能够无需借助其他第三方插件,利用JavaScript的Canvas图形工具,在Canvas元素画板上实现动态绘制图形。

        Websocket,提供了一个直接与服务器通讯的Socket。使得在通讯建立之后,客户端(浏览器)能够与网页服务器实现双向通讯,而无需客户端频繁轮询服务器实现。这样能够减少Http请求的额外开销,减轻数据包负担,而且通讯更加实时。

        通过对于这2个API函数的灵活应用,我们实现了通过HTTP Server,实时的接收数据量,并在网页Web上动态模拟的功能。

    在线实时采集系统演示

    1. 系统环境

    a)         单片机:STM32F103RC,256K字节Flash,48K字节SRAM,2K字节EEPROM

    b)        以太网控制器:W5500,SPI接口与单片机相连

    c)         电源:USB供电

    2. 开发工具: IAR for ARM v5.41,这是我们工程所使用的版本。如果使用不同版本的IAR,请对STM的库稍作调整。

    看代码之前,我们还是先来了解一下整个的程序流程,如下图所示。在硬件初始化完成之后,将进行网络参数配置,这是要根据自己网络的情况来配置W5500的IP地址等网络参数,确保W5500能连网;本程序中,我们会使用W5500的两个socket资源,一个用来创建Http Server,这样在浏览器上输入配置的IP地址,就能远程访问我们的硬件了;另一个用来创建Web Socket Server,与网页端建立通信链路,用来传输我们的温湿度数据。

    HTML5-2

    图2硬件运行流程

        当我们在浏览器上访问硬件的IP地址,会向W5500发送http请求,W5500在收到请求后将html5的网页信息发送给浏览器,这样浏览器上就能显示我们的温湿度检测系统的主界面了。在网页的代码中,浏览器会主动连接W5500的Web Socket Server,在完成握手操作后,数据通信通道即建立了。这样硬件就可以无障碍的将温湿度数据发送给浏览器端,浏览器在收到温湿度数据后,使用画布功能,在指定位置画出温湿度示数的点和曲线。以下是html5中Web Socket(网络套接字)和Canvas(画布)代码、W5500的Web Socket握手和数据帧协议、温湿度采集程序的介绍。

     HTML5-3

    图3网页显示界面

    Canvas和Web Socket

        在浏览器端我们使用HTML5的Canvas绘制工具和WebSocket API搭建我们的web界面。当有新的温湿度数据来临时,在画布的坐标系里会有画点显示,并标识示数,并且随着采集次数的增加,多个数据连线,就可以看到曲线变化。网页程序步骤如下:

    1)  创建页面和canvas所属的style、body标记

    2)  绘制坐标轴,添加标题;建立WebSocket连接

    3)  新数据到来,绘制点和线

    利用Canvas绘图

    下面先介绍如何创建一张画布以及代码中使用到的绘制函数。

    1) 建立一张600×400的画布,单位是像素

    <canvasid=‘graph’width=’600′height=’400′></canvas>

    2) 定义画布的边框宽度、颜色和内边距大小。

    #graph {

    border: 1px solid #03F;

    margin:0 40px 0 80px;

    }

    3) 为了在JavaScript中对canvas进行绘制,首先需要通过目标canvas的id获取绘制环境。代码需要通过id获取canvas元素,然后使用此元素的getContex方法获取其二维绘制环境的引用

    canvas=document.getElementById(‘graph’);

    context=canvas.getContext(’2d’);

    4) 绘制一条线段

    context.lineWidth=2;//设置线宽

    context.strokeStyle=‘#999′;//设置线的颜色

    context.moveTo(x1,y1);//移动到起点

    context.lineTo(x2,y2);//创建到终点的路径

    context.stroke();//实际绘出这段直线

    5) 绘制圆

    context.fillStyle=‘#000′;//设置填充色

    context.beginPath();

    context.arc(x,y,2,0,Math.PI*2,true);//在坐标(x,y)处绘制半径2的圆

    context.closePath();

    context.fill();//在圆内填充颜色

    6) 在指定位置写标题文字

    context.fillText(text,x,y,maxWidth);

    使用以上函数组合即可绘制如下的图了,如果您觉得这还不够炫,html5的canvas中还提供了渐变色、旋转、插图等函数,发挥你的设计才能动手制作属于自己的前端界面吧。

     HTML5-4

    图4画布示例图

    WebSocket的使用 接下来我们介绍html5中WebSocket的使用以及相关函数

    1)  为了创建一个websocket连接,代码需要创建一个WebSocket接口实例,传入Web服务URL地址,sensorWebSocket对象会试图连接监听于相应的URL的服务

    varwsUri=‘ws:192.168.10.111:1818′;

    sensorWebSocket=newWebSocket(wsUri);

    2)  注册事件并为事件链接相应处理函数,例如,在浏览器页面收到来自服务器端的数据后,触发onmessage事件,进而调用onMessage函数,代码中我们注册了onopen、onmessage、onclose和onerror四个事件

    sensorWebSocket.onmessage=function(evt){onMessage(evt)};

    3)  消息处理函数,在硬件上我们将采集来的温湿度数据用‘.’号连接,在浏览器端,接收到数据后,使用字符串分割函数将温度和湿度数据分割,存储在一个数组对象里。之后的代码就是将示数转化成坐标值在画布上显示出来,这里不再赘述。

    functiononMessage(evt){

    vararrayTH=new Array(2);

    arrayTH=evt.data.split(‘.’);

    ……

    }

    4)  主动关闭websocket连接

    sensorWebSocket.close();

        怎么样,websocket的使用很简单吧,有了这个利器,就可以与远程服务器连接并接受和发送消息,该功能在双向通信方面十分有用,特别是在服务器需要主动向浏览器页面发送消息时。

    Web Socket握手和数据帧

     

    在服务器端创建好socket后,首先要与客户端完成握手才能开始数据通信,那么这个握手在程序上市如何实现的呢,先看下握手的流程:

    表1握手流程

      HTML5-5

       

    客户端的代码在上面已经介绍,下面是硬件中服务器1、2的代码:

    #define WS_SERVER_PORT  1818//定义服务器监听的端口号

    socket(s,Sn_MR_TCP, WS_SERVER_PORT,0×20);//W5500中建立socket连接

    listen(s);//开启侦听 s变量为W5500socket序号,此例程中使用2

    以下是给W5500配置的网络信息,其中IP地址即为我们浏览器页面程序websocket对象的监听地址。

    uint8 mac[6]={0×00,0×08,0xdc,0×11,0×11,0×11};

    uint8 lip[4]={192,168,10,111};

    uint8 sub[4]={255,255,255,0};

    uint8gw[4]={192,168,10,1};

    setSHAR(mac);

    setSUBR(sub);

    setGAR(gw);

    setSIPR(lip);

    硬件中有关服务器5、6、7流程的代码:

    charsec_ws_key[32]={0×00,};

    characcept_key[32]={0×00,};

    //get Sec-WebSocket-Key:

    if(strstr((charconst*)wsRxBuf,“Sec-WebSocket-Key: “))

    {

    mid((char*)wsRxBuf,“Sec-WebSocket-Key: “,“\r\n”,sec_ws_key);//截取sec_key

    calc_accept_key(sec_ws_key,accept_key);//编码函数

    sprintf((char*)wsTxBuf,“HTTP/1.1 101 SwitchingProtocols\r\nUpgrade: WebSocket\r\nConnection:Upgrade\r\nSec-WebSocket-Accept: %s\r\n\r\n”,accept_key);//生成握手消息

    send(s,wsTxBuf,strlen((char*)wsTxBuf));//发送给客户端

    }

    handshaked=1;

        这样看起来可能有点抽象,我们看看实际的数据包吧,上边红色字体为浏览器页面的握手请求,Sec-websoket-Key后即为我们截取的sec_key,后边的蓝色字体为服务器端的握手回复,Sec-websoket-Accept后为我们编码后的accept_key,怎么样,一目了然了吧。 HTML5-6

    图5握手过程抓包信息

        在握手成功后,在硬件端就可以将每隔一段时间采集来的温湿度数据发送给浏览器页面。WebSocket协议的数据包非常轻量,下面介绍数据包的帧格式:

    HTML5-7

    图6WebSocket数据帧格式

        上图是官方提供的结构图,第一个字节,第一位是FIN,后面三位是RSV1到3。RSV是预留的空间,用 0填充,那么前4位只有第一位的FIN需要设置。接着后面的四位是储存opcode的值,opcode定义负载数据的解释。FIN用来指示消息的最后片段,如果只有一条消息,那么FIN就是1;这里我们用opcode定义数据是文本-0×1,这样第一个字的二进制是1000001(0×81),第一个1是FIN的值,最后一个1是opcode的值。

        接着是第二个字节的数据,它由1位的MASK和7位的PayloadLen组成,MASK标识这个数据帧的数据是否使用掩码,PayloadLen表示数据部分的长度。但是PayloadLen只有7位,换成无符号整型的话只有0到127的取值,这么小的数值当然无法描述较大的数据,因此规定当数据长度小于或等于125时候它才作为数据长度的描述,如果这个值为126,则时候后面的两个字节来储存储存数据长度,如果为127则用后面八个字节来储存数据长度。这里我们每次发送的温湿度数据只有5个字节,并且不使用掩码,所以配置为0×05。

        再接着是上面图表中的MaskingKey,它占四个字节,储存掩码的实体部分。但是只有在前面的MASK被设置为1时候才存在这个数据,否则不使用掩码也就没有这个数据了。 最后是数据部分,如果掩码存在,那么所有数据都需要与掩码做一次异或运算。如果不存在掩码,那么后面的数据就可以直接使用。

        看看我们数据发送的代码是如何实现的吧:

    wsTxBuf[0]=0×81;

    wsTxBuf[1]=0×05;

    wsTxBuf[2]= Temp/10+0×30;

    wsTxBuf[3]= Temp%10+0×30;

    wsTxBuf[1]=0x2E;//分隔符‘.

    wsTxBuf[2]=Humi/10+0×30;

    wsTxBuf[3]= Humi%10+0×30;

    send(s,wsTxBuf,strlen((char*)wsTxBuf));

    是不是代码很easy!

    数据采集

        那么另外简述一下数据的采集过程。 我们选用的是温湿度传感器DHT11,进行对室内温湿度数据的实时采集与上传。这里就用DHT11与单片机连接(W5500),它与单片机的通信只需要一个I/O口,使用很简单。 具体DHT11与单片机的连接 与相关调试,这里就不详细讲解了。可以搜索相关资料。

        相信随着HTML5的不断成熟,它带来的不仅仅是PC环境的Web革命。对于嵌入式领域来说,也能够带来更好的客户体验及产品性能。当然,我们仍然还需要借助W5500这个颇具特色的以太网芯片。其全硬件TCP/IP协议栈不仅大大节约了颇为珍贵的嵌入式资源,而且节省了很多开发步骤及难度,从而能让我们能够更多的资源与精力去实现更为精彩的Web功能。

        如果你感兴趣的话,赶快来做一个属于你的在线实时采集系统吧。

        完整的程序代码程序请到http://wizwiki.net/forum/viewtopic.php?f=91&t=740&p=2527#p2527下载

    展开全文
  • HTML5视频直播及H5直播扫盲

    万次阅读 2016-08-15 14:00:22
    分享内容简介: 目前视频直播,尤其是移动端的视频直播已经火到不行了,基本上各大互联网公司都有了自己的直播产品,所以对于直播的一些基本知识和主要...1. 怎样利用 HTML5 来播放直播视频 2. 怎样录制直播视频 3.

    文章来源:http://geek.csdn.net/news/detail/95188

    分享内容简介:
    目前视频直播,尤其是移动端的视频直播已经火到不行了,基本上各大互联网公司都有了自己的直播产品,所以对于直播的一些基本知识和主要技术点也要有所了解,本次分享就向大家介绍一下其中的奥秘。

    内容大体框架:
    1. 怎样利用 HTML5 来播放直播视频
    2. 怎样录制直播视频
    3. 怎样实时上传直播视频
    4. 直播中的用户交互

    分享人介绍:

    吕鸣 目前在腾讯SNG担任手Q的web前端开发工作
    博客:http://www.nihaoshijie.com.cn/


    下面是本期分享内容整理


    Hello, 大家好,我是吕鸣,目前是在腾讯 SNG 的即通应用部负责手Q的兴趣部落 Web 前端开发工作。

    针对目前比较火的视频直播,我做了一些研究和探索,同时我们的项目将会用到直播为此打下技术基础,下面就向大家分享一下直播的整个流程和一些技术点。

    一、移动视频直播发展

    大家首先来看下面这张图:

    可以看到,直播从 PC 到一直发展到移动端,越来越多的直播类 App 上线,同时移动直播进入了前所未有的爆发阶段,但是对于大多数移动直播来说,还是要以 Native 客户端实现为主,但是 HTML5 在移动直播端也承载着不可替代的作用,例如 HTML5 有着传播快,易发布的优势,同时最为关键的时 HTML5 同样可以播放直播视频。

    大家可以看下面这张大概的实现图

    完整的直播可以分为以下几块:

    1. 视频录制端:一般是电脑上的音视频输入设备或者手机端的摄像头或者麦克风,目前以移动端的手机视频为主。
    2. 视频播放端:可以是电脑上的播放器,手机端的 Native 播放器,还有就是 HTML5 的 video 标签等,目前还是已手机端的 Native 播放器为主。
    3. 视频服务器端:一般是一台 nginx 服务器,用来接受视频录制端提供的视频源,同时提供给视频播放端流服务。

    大家可以看下大致的结构图:

    二、HTML5 录制视频:

    对于HTML5视频录制,可以使用强大的 webRTC (Web Real-Time Communication)是一个支持网页浏览器进行实时语音对话或视频对话的技术,缺点是只在 PC 的 Chrome 上支持较好,移动端支持不太理想。

    使用 webRTC 录制视频基本流程是:

    1. 调用 window.navigator.webkitGetUserMedia() 获取用户的PC摄像头视频数据。
    2. 将获取到视频流数据转换成 window.webkitRTCPeerConnection (一种视频流数据格式)。
    3. 利用 webscoket 将视频流数据传输到服务端

    由于许多方法都要加上浏览器前缀,所以很多移动端的浏览器还不支持 webRTC,所以真正的视频录制还是要靠客户端(iOS,Android)来实现,效果会好一些。

    三、HTML5 播放直播视频:

    对于视频播放,可以使用 HLS(HTTP Live Streaming)协议播放直播流,iOS和 Android 都天然支持这种协议,配置简单,直接使用 video 标签即可。

    下面是简单的代码使用 video 播放直播视频:

    1.什么是 HLS 协议:

    简单讲就是把整个流分成一个个小的,基于 HTTP 的文件来下载,每次只下载一些,前面提到了用于 HTML5 播放直播视频时引入的一个 .m3u8 的文件,这个文件就是基于 HLS 协议,存放视频流元数据的文件。

    每一个 .m3u8 文件,分别对应若干个 ts 文件,这些 ts 文件才是真正存放视频的数据,m3u8 文件只是存放了一些 ts 文件的配置信息和相关路径,当视频播放时,.m3u8 是动态改变的,video 标签会解析这个文件,并找到对应的 ts 文件来播放,所以一般为了加快速度,.m3u8 放在 Web 服务器上,ts 文件放在 CDN 上。

    .m3u8 文件,其实就是以 UTF-8 编码的 m3u 文件,这个文件本身不能播放,只是存放了播放信息的文本文件。

    打开之后就是这个样子:

    下面这个是 ts 文件,就是存放视频的文件:

    2.HLS 的请求流程:

    1. HTTP 请求 m3u8 的 url。
    2. 服务端返回一个 m3u8 的播放列表,这个播放列表是实时更新的,一般一次给出5段数据的 url。
    3. 客户端解析 m3u8 的播放列表,再按序请求每一段的 url,获取 ts 数据流。

    大概是这个流程:

    3.HLS 直播延时:

    我们知道 hls 协议是将直播流分成一段一段的小段视频去下载播放的,所以假设列表里面的包含5个 ts 文件,每个 TS 文件包含5秒的视频内容,那么整体的延迟就是25秒。因为当你看到这些视频时,主播已经将视频录制好上传上去了,所以时这样产生的延迟。当然可以缩短列表的长度和单个 ts 文件的大小来降低延迟,极致来说可以缩减列表长度为1,并且 ts 的时长为1s,但是这样会造成请求次数增加,增大服务器压力,当网速慢时回造成更多的缓冲,所以苹果官方推荐的 ts 时长时10s,所以这样就会大改有30s的延迟。所以服务器接收流,转码,保存,切块,再分发给客户端,这里就延时的根本原因。

    更多关于延迟的问题可以参考苹果官方地址:
    https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html

    但是 HTML5 直播视频却有一些不可替代的优势:

    1. 传播性好,利于分享等操作。
    2. 可以动态发布,有利于实时迭代产品需求并迅速上线。
    3. 不用安装 App,直接打开浏览器即可。

    四、iOS 采集(录制)音视频数据OS

    关于音视频采集录制,首先明确下面几个概念:

    • 视频编码:所谓视频编码就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式,我们使用的 iPhone 录制的视频,必须要经过编码,上传,解码,才能真正的在用户端的播放器里播放。
    • 编解码标准:视频流传输中最为重要的编解码标准有国际电联的 H.261、H.263、H.264,其中 HLS 协议支持 H.264 格式的编码。
    • 音频编码:同视频编码类似,将原始的音频流按照一定的标准进行编码,上传,解码,同时在播放器里播放,当然音频也有许多编码标准,例如 PCM 编码,WMA 编码,AAC 编码等等,这里我们 HLS 协议支持的音频编码方式是 AAC 编码。

    利用 iOS 上的摄像头,进行音视频的数据采集,主要分为以下几个步骤:

    1. 音视频的采集,iOS 中,利用 AVCaptureSession 和 AVCaptureDevice 可以采集到原始的音视频数据流。
    2. 对视频进行 H264 编码,对音频进行 AAC 编码,在 iOS 中分别有已经封装好的编码库来实现对音视频的编码。
    3. 对编码后的音、视频数据进行组装封包;
    4. 建立 RTMP 连接并上推到服务端。

    下面是具体的采集音视频数据的流程:

    1.关于 RTMP:

    Real Time Messaging Protocol(简称 RTMP)是 Macromedia 开发的一套视频直播协议,现在属于 Adobe。和 HLS 一样都可以应用于视频直播,区别是 RTMP 基于 flash 无法在 iOS 的浏览器里播放,但是实时性比 HLS 要好。所以一般使用这种协议来上传视频流,也就是视频流推送到服务器。

    下面是 HLS 和 RTMP 的对比:

    2.推流

    所谓推流,就是将我们已经编码好的音视频数据发往视频流服务器中,在 iOS 代码里面一般常用的是使用 RTMP 推流,可以使用第三方库 librtmp-iOS 进行推流,librtmp 封装了一些核心的 API 供使用者调用。例如推流 API 等等,配置服务器地址,即可将转码后的视频流推往服务器。

    那么如何搭建一个推流服务器呢?

    简单的推流服务器搭建,由于我们上传的视频流都是基于 RTMP 协议的,所以服务器也必须要支持 RTMP 才行,大概需要以下几个步骤:

    1. 安装一台 nginx 服务器。
    2. 安装 nginx 的 RTMP 扩展,目前使用比较多的是 https://github.com/arut/nginx-rtmp-module
    3. 配置 nginx 的 conf 文件
    4. 重启 nginx,将 RTMP 的推流地址写为 rtmp://ip:1935/hls/mystream, 其中 hls_path 表示生成的 .m3u8 和 ts 文件所存放的地址,hls_fragment 表示切片时长,mysteam 表示一个实例,即将来要生成的文件名可以先自己随便设置一个。

    更多配置可以参考:https://github.com/arut/nginx-rtmp-module/wiki/

    下面是 nginx 的配置文件

    五、直播中的用户交互:

    对于直播中的用户交互大致可以分为:

    1. 送礼物
    2. 发表评论或者弹幕

    对于送礼物,在 HTML5 端可以利用 DOM 和 CSS3 实现送礼物逻辑和一些特殊的礼物动画,实现技术难点不大。

    对于弹幕来说,要稍微复杂一些,可能需要关注以下几点:

    1. 弹幕实时性,可以利用 webscoket 来实时发送和接收新的弹幕并渲染出来。
    2. 对于不支持 webscoket 的浏览器来说,只能降级为长轮询或者前端定时器发送请求来获取实时弹幕。
    3. 弹幕渲染时的动画和碰撞检测(即弹幕不重叠)等等

    六、总结

    目前较为成熟的直播产品,大致都是以 Server 端和 HTML5 和 Native(android,ios)搭配实现直播:

    基本是下图这个套路:

    所以 HTML5 在整个直播中,还是有着重要的地位的!

    Demo 分享

    最后,根据本次分享的内容,我这边实现了一个 iOS 端录制,推流,NGINX 接收流,同时分发的 HLS 直播流的一整套 Demo,感兴趣的同学可以看下面这个链接:

    https://github.com/lvming6816077/LMVideoTest

    好了,本次分享先到这里了,谢谢大家~

    互动问答环节

    Q1: Demo 包含 iOS 端的 RTMP 播放不?

    答:Demo 里面没有 RTMP 的播放,Demo 主要是提供录制,推流的。

    Q2: 对于 HTML5 HLS 播放 卡顿问题,前端与 server 端,有什么配置上的优化吗?

    答:server 端要做好分片策略,同时要将 ts 文件放在 CDN 上,前端这边可以尽量做到 DNS 缓存等,由于HTML5是使用的 video 标签,所以要修改 video 的播放优化,还是不那么容易。

    Q3: 在手机推流时的码率是根据怎样的策略做选择的?不同机型和网络下如何保持流畅?

    答:可以提供不同的视频码率来供用户选择,例如网速差的可以选择较为低清晰度的码率,网络好的用户可以选择更加清晰的码率,同时做好视频播放端的容错和异常处理等等。

    Q4: RTMP 比起 HTTP 他的优势主要是几种在哪里?

    答:RTMP 是基于 TCP 的保持的是长连接,而 HTTP 是一次性的,每次都要三次握手,所以对于直播来说还是 RTMP 好一些

    Q5: 据我所知 nginx rtmp-module 好像性能不是很高…..为什么会采用这个来作为后端服务?

    答:这里只是 Demo 用了这个 nginx rtmp-module,其实也可已选择 SRS(simple-rtmp-server)都是可以的哈

    Q6: 移动端这边怎么进行编码转码?用 ffmpeg 编译时很麻烦

    答:关于 iOS 这边,其实不用关心转码问题,因为已经有了很多开源的库提供给我们了例如:
    x264 编码:https://github.com/kewlbear/x264-ios
    faac 编码:https://github.com/fflydev/faac-ios-build

    Q7: 您介绍的都是 Native 播放和还有 HTML5 的 video 标签播放, iOS 端有没有考虑过整个用原生的 OC 或者 Swift 实现?

    答:关于播放端,其实真正体验好的还是要用 native 来实现的,而且 native 实现可以用 RTMP 来播放直播,延迟会好很多,HTML5 来播直播主要是考虑到易传播性好。

    Q8: 在用户非常多的情况下,或者网络慢的情况下,有什么策略可以保证质量?

    答:可以提供不同的视频码率来供用户选择,例如网速差的可以选择较为低清晰度的码率,网络好的用户可以选择更加清晰的码率,同时做好视频播放端的容错和异常处理等等。

    Q9: 请问直播这块的测试中关注的几个指标是什么,有什么比较好的测试方法呢?

    答:主要就是:
    1. 首次打开的白屏时间
    2. 直播中的卡顿和缓冲
    3. 直播的延时

    Q10: 您提供的 Demo 为什么不是 HTML5 的呢 iOS 推流和 nginx 服务器都有,能不能提供一个前面第二张叶子美女直播那个页面的 Demo?

    答:这个 Demo 你下载下拉运行的话,根据配置就可直接自己实现一个利用 HTML5 直播的页面,很简单,就像使用 video 标签一样,其他的样式你可以自己定制的。

    Q11: HLS 的延时有没有比较好的方法解决?

    答:HLS 确实是会有延迟,相对比较优的策略是调整好分片策略,在保证性能的情况下,和延迟达到平衡。

    Q12: 如果加入视频电话功能,上面的结构需要作什么改变?视频电话的目的大概是:直播可以选择某一观众或者多个观众视频对话

    答:视频电话,也就是说作为视频录制端的同时也作为视频播放端,所以实现实时电话简单就是:我在直播的同时观看别人的直播视频,别人在直播的同时观看我的直播视频,可以这样理解,上面的结构复制一份对调即可。

    Q13: 如何实现滤镜功能?

    答:一般是在视频录制之后,在转码前给视频数据增加滤镜功能,在 iOS 里可以使用一些滤镜库等等实现滤镜功能

    Q14: 在 App 端如果不利用 HTML5 能实现直播吗?

    答:可以啊,app 有更加丰富的播放接口,和开源播放器可以实现直播的。

    Q15: 既然 HLS 有较高的延迟 为什么苹果推荐的的方式却是 HLS?

    答:并不是说苹果主要推荐使用 HLS,对于 HTML5 来说目前只有这一种比较好的方式来播放直播视频,所以还是很期待苹果能对延迟问题做一些改进的。

    Q16: 同滤镜问题,音频变声是如何实现的?

    答:同样是可以在对音频转码前操作。

    Q17: 如果针对网络较差的观看用户,是需要直播推流到服务器后做多份不同分辨率的拷贝,以适应不同网络的用户观看?如果是这样的话,对延迟会不会影响很大? 毕竟编解码也是需要时间的.

    答:这个其实本身就应该做的,对于网络差的用户,完全可以提供给他们较低码率的直播流来减少卡顿问题,延迟问题的话还是要根据具体使用哪种协议来定。

    Q18: 推流目前大部分都是第三方在做,难度点在哪?然后目前业内比较成熟的主要哪些?

    答:难点主要是服务器端的性能压力和分发直播流的效率,业界都已经有了较成熟的方案,例如腾讯云的直播。

    点此查看 Dev Club 往期分享汇总


    腾讯 Bugly是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的情况以及解决方案。智能合并功能帮助开发同学把每天上报的数千条Crash 根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同学定位到出问题的代码行,实时上报可以在发布后快速的了解应用的质量情况,适配最新的 iOS、Android 官方操作系统。


    下面是H5相关扫盲方面的知识:

    文章来源:https://www.nihaoshijie.com.cn/index.php/archives/615

    视频直播这么火,再不学就out了。

    为了紧跟潮流,本文将向大家介绍一下视频直播中的基本流程和主要的技术点,包括但不限于前端技术。

    1 H5到底能不能做视频直播?

    当然可以, H5火了这么久,涵盖了各个方面的技术。

    对于视频录制,可以使用强大的webRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音对话或视频对话的技术,缺点是只在PC的chrome上支持较好,移动端支持不太理想。

    对于视频播放,可以使用HLS(HTTP Live Streaming)协议播放直播流,ios和android都天然支持这种协议,配置简单,直接使用video标签即可。

    webRTC兼容性:

    video标签播放hls协议视频:

    <video controls autoplay>  
        <source src="http://10.66.69.77:8080/hls/mystream.m3u8" type="application/vnd.apple.mpegurl" />  
        <p class="warning">Your browser does not support HTML5 video.</p>  
    </video>

    2 到底什么是HLS协议?

    当简单讲就是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些,前面提到了用于H5播放直播视频时引入的一个.m3u8的文件,这个文件就是基于HLS协议,存放视频流元数据的文件。

    每一个.m3u8文件,分别对应若干个ts文件,这些ts文件才是真正存放视频的数据,m3u8文件只是存放了一些ts文件的配置信息和相关路径,当视频播放时,.m3u8是动态改变的,video标签会解析这个文件,并找到对应的ts文件来播放,所以一般为了加快速度,.m3u8放在web服务器上,ts文件放在cdn上。

    .m3u8文件,其实就是以UTF-8编码的m3u文件,这个文件本身不能播放,只是存放了播放信息的文本文件:

    ​#EXTM3U                     m3u文件头
    #EXT-X-MEDIA-SEQUENCE       第一个TS分片的序列号
    #EXT-X-TARGETDURATION       每个分片TS的最大的时长
    #EXT-X-ALLOW-CACHE          是否允许cache
    #EXT-X-ENDLIST              m3u8文件结束符
    #EXTINF                     指定每个媒体段(ts)的持续时间(秒),仅对其后面的URI有效
    mystream-12.ts

    ts文件:

    HLS的请求流程是:
    1 http请求m3u8的url
    2 服务端返回一个m3u8的播放列表,这个播放列表是实时跟新的,一般一次给出3段数据的url
    3 客户端解析m3u8的播放列表,再按序请求每一段的url,获取ts数据流

    简单流程:

    3 HLS直播延时

    当我们知道hls协议是将直播流分成一段一段的小段视频去下载播放的,所以假设列表里面的包含5个TS文件,每个TS文件包含5秒的视频内容,那么整体的延迟就是25秒。因为当你看到这些视频时,主播已经将视频录制好上传上去了,所以时这样产生的延迟。当然可以缩短列表的长度和单个TS文件的大小来降低延迟,极致来说可以缩减列表长度为1,并且TS的时长为1s,但是这样会造成请求次数增加,增大服务器压力,当网速慢时回造成更多的缓冲,所以苹果官方推荐的ts时长时10s,所以这样就会大改有30s的延迟。参考资料:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StreamingMediaGuide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html

    4 视频直播的整个流程是什么?

    当视频直播可大致分为:

    1 视频录制端:一般是电脑上的音视频输入设备或者手机端的摄像头或者麦克风,目前已移动端的手机视频为主。

    2 视频播放端:可以是电脑上的播放器,手机端的native播放器,还有就是h5的video标签等,目前还是已手机端的native播放器为主。

    3 视频服务器端:一般是一台nginx服务器,用来接受视频录制端提供的视频源,同时提供给视频播放端流服务。

    简单流程:

     

     

    5 怎样进行音视频采集?

    当首先明确几个概念:

    视频编码:所谓视频编码就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式,我们使用的iphone录制的视频,必须要经过编码,上传,解码,才能真正的在用户端的播放器里播放。

    编解码标准:视频流传输中最为重要的编解码标准有国际电联的H.261、H.263、H.264,其中HLS协议支持H.264格式的编码。
    音频编码:同视频编码类似,将原始的音频流按照一定的标准进行编码,上传,解码,同时在播放器里播放,当然音频也有许多编码标准,例如PCM编码,WMA编码,AAC编码等等,这里我们HLS协议支持的音频编码方式是AAC编码

    下面将利用ios上的摄像头,进行音视频的数据采集,主要分为以下几个步骤:

     

    1 音视频的采集,ios中,利用AVCaptureSessionAVCaptureDevice可以采集到原始的音视频数据流。
    2 对视频进行H264编码,对音频进行AAC编码,在ios中分别有已经封装好的编码库来实现对音视频的编码。
    3 对编码后的音、视频数据进行组装封包;
    4 建立RTMP连接并上推到服务端。

     

    ps:由于编码库大多使用c语言编写,需要自己使用时编译,对于ios,可以使用已经编译好的编码库。

    x264编码:https://github.com/kewlbear/x264-ios

    faac编码:https://github.com/fflydev/faac-ios-build

    ffmpeg编码:https://github.com/kewlbear/FFmpeg-iOS-build-script

    关于如果想给视频增加一些特殊效果,例如增加滤镜等,一般在编码前给使用滤镜库,但是这样也会造成一些耗时,导致上传视频数据有一定延时。

    简单流程:

    6 前面提到的ffmpeg是什么?

    和之前的x264一样,ffmpeg其实也是一套编码库,类似的还有Xvid,Xvid是基于MPEG4协议的编解码器,x264是基于H.264协议的编码器,ffmpeg集合了各种音频,视频编解码协议,通过设置参数可以完成基于MPEG4,H.264等协议的编解码,demo这里使用的是x264编码库。

    7 什么是RTMP?

    Real Time Messaging Protocol(简称 RTMP)是 Macromedia 开发的一套视频直播协议,现在属于 Adobe。和HLS一样都可以应用于视频直播,区别是RTMP基于flash无法在ios的浏览器里播放,但是实时性比HLS要好。所以一般使用这种协议来上传视频流,也就是视频流推送到服务器。

    这里列举一下hls和rtmp对比:

    8 推流

    简所谓推流,就是将我们已经编码好的音视频数据发往视频流服务器中,一般常用的是使用rtmp推流,可以使用第三方库librtmp-iOS进行推流,librtmp封装了一些核心的api供使用者调用,如果觉得麻烦,可以使用现成的ios视频推流sdk,也是基于rtmp的,https://github.com/runner365/LiveVideoCoreSDK

    9 推流服务器搭建

    简简单的推流服务器搭建,由于我们上传的视频流都是基于rtmp协议的,所以服务器也必须要支持rtmp才行,大概需要以下几个步骤:

    1 安装一台nginx服务器。

    2 安装nginx的rtmp扩展,目前使用比较多的是https://github.com/arut/nginx-rtmp-module

    3 配置nginx的conf文件:

    rtmp {  
      
        server {  
      
            listen 1935;  #监听的端口
      
            chunk_size 4000;  
            
             
            application hls {  #rtmp推流请求路径
                live on;  
                hls on;  
                hls_path /usr/local/var/www/hls;  
                hls_fragment 5s;  
            }  
        }  
    }

    4 重启nginx,将rtmp的推流地址写为rtmp://ip:1935/hls/mystream,其中hls_path表示生成的.m3u8和ts文件所存放的地址,hls_fragment表示切片时长,mysteam表示一个实例,即将来要生成的文件名可以先自己随便设置一个。更多配置可以参考:https://github.com/arut/nginx-rtmp-module/wiki/

    根据以上步骤基本上已经实现了一个支持rtmp的视频服务器了。

    10 在html5页面进行播放直播视频?

    简单来说,直接使用video标签即可播放hls协议的直播视频:

    <video autoplay webkit-playsinline>  
        <source src="http://10.66.69.77:8080/hls/mystream.m3u8" type="application/vnd.apple.mpegurl" />  
        <p class="warning">Your browser does not support HTML5 video.</p>  
    </video>

    需要注意的是,给video标签增加webkit-playsinline属性,这个属性是为了让video视频在ios的uiwebview里面可以不全屏播放,默认ios会全屏播放视频,需要给uiwebview设置allowsInlineMediaPlayback=YES。业界比较成熟的videojs,可以根据不同平台选择不同的策略,例如ios使用video标签,pc使用flash等。

    11 坑点总结

    简根据以上步骤,笔者写了一个demo,从实现ios视频录制,采集,上传,nginx服务器下发直播流,h5页面播放直播视频者一整套流程,总结出以下几点比较坑的地方:

    1 在使用AVCaptureSession进行采集视频时,需要实现AVCaptureVideoDataOutputSampleBufferDelegate协议,同时在- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection捕获到视频流,要注意的是didOutputSampleBuffer这个方法不是didDropSampleBuffer方法,后者只会触发一次,当时开始写的是didDropSampleBuffer方法,差了半天才发现方法调用错了。

    2 在使用rtmp推流时,rmtp地址要以rtmp://开头,ip地址要写实际ip地址,不要写成localhost,同时要加上端口号,因为手机端上传时是无法识别localhost的。

    这里后续会补充上一些坑点,有的需要贴代码,这里先列这么多。

    12 业界支持

    目前,腾讯云,百度云,阿里云都已经有了基于视频直播的解决方案,从视频录制到视频播放,推流,都有一系列的sdk可以使用,缺点就是需要收费,如果可以的话,自己实现一套也并不是难事哈。

     

    demo地址:https://github.com/lvming6816077/LMVideoTest/




    更多直播相关知识:http://lib.csdn.net/base/liveplay

    展开全文
  • 在了解html5之前,首先要说一下html语言,尽管是更新后的5,但很多的地方还是保留了html的优势。 HTML是HyperText Markup Language超级文本标记语言的缩写,是标准通用标记语言下的一个应用,也是一种规范,一种标准...
  • 速度挑战 - 2小时完成HTML5拼图小游戏

    万次阅读 多人点赞 2016-08-11 19:32:29
    初学lufylegend.js之日,我用lufylegend.js开发了第一个HTML5小游戏——拼图游戏,还写了篇博文来炫耀一下:HTML5小游戏《智力大拼图》发布,挑战你的思维风暴。不过当时初学游戏开发,经验浅薄,所以没有好好专研...
  • HTML5常用知识点梳理

    千次阅读 多人点赞 2018-07-31 15:46:57
    HTML5属于上一代HTML的新迭代语言,设计HTML5最主要的目的是为了在移动设备上支持多媒体! 例如: video 标签和 audio 及 canvas 标记 ☞ 新特性: 1. 取消了过时的显示效果标记 &amp;amp;amp;amp;amp;...
  • HTML5笔记(3) - HTML5现状

    万次阅读 热门讨论 2011-04-29 16:15:00
      前言:每一种新技术刚展现在人们面前时,人们总是习惯于从技术特性的角度(而不是用户需求)来... Demo   关于HTML5已经有很多Demo和教程网站了,还有很多基于HTML5创建的开源项目,甚至
  • HTML5-基础知识

    万次阅读 2018-01-10 15:20:29
    HTML5@author 鲁伟林 一直开发后端,现在开始全栈培养自己。 学习html的网址是:http://www.runoob.com/html/html5-intro.html gitHub地址: ...
  • HTML5基础知识汇总

    千次阅读 多人点赞 2018-08-30 14:58:18
    HTML5基本语法 扩展名.html/.htm 内容类型(ContentType):text/html 文档类型: 字符编码 HTML4: &amp;amp;amp;amp;amp;amp;amp;lt;meta http-equiv=&amp;amp;amp;amp;amp;amp;quot;Content-Type&...
  • 通过HTML5开发移动App时,会发现HTML5很多能力具备。为弥补HTML5能力的不足,在W3C中国的指导下成立了www.HTML5Plus.org组织,推出HTML5+规范。 HTML5+扩展了JavaScript对象plus,使得js可以调用各种浏览器无法...
  • HTML5游戏开发-扫雷及其算法研究

    万次阅读 2015-05-29 22:59:52
    以下是本次开发的游戏截图: 测试地址: http://yuehaowang.github.io/demo/minesweeper/ 算法研究 扫雷虽然属于游戏开发初级学者研究的范畴,但是由于我是那种好高骛远的家伙,所以,虽然接触游戏开发...
  • 以前lufy前辈写过叫“ html5游戏开发-零基础开发RPG游戏”的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本。自从看了那几篇文章,我便对游戏开发有了基本的认识。今天我也以零基础为视点,为大家讲述如何...
  • HTML5+CSS3

    万次阅读 多人点赞 2020-02-09 18:20:26
    HTML 1. 浏览器内核 五大浏览器四大内核 浏览器:IE(edge), 火狐, ...注1: 提到Chrome浏览器,一般人会认为使用的Webkit内核(移动设备多),这种说法完全确。Chrome发布于2008年,使用的渲染内核是Chromium...
  • HTML5新特性浅谈

    万次阅读 多人点赞 2016-10-17 21:25:58
    2014年10月29日,W3C宣布,经过接近8年的艰苦努力,HTML5标准规范终于制定完成。HTML5将会取代1999年制定的HTML 4.01、XHTML 1.0标准,以期能在互联网应用迅速发展的时候,使网络标准达到符合当代的网络需求,为桌面...
  • HTML5新增的标签和属性归纳

    万次阅读 2017-01-27 11:21:24
    收集总结的HTML5的新特性,基本除了IE9以下都可以使用。 HTML5语法 大部分延续了html的语法 不同之处:开头的 字符编码变得简洁, 区分大小写, 添加了布尔值,类似checked,selected ...
  • 问卷调查Html5开发总结

    万次阅读 2017-08-03 14:44:03
    Html5能够离线操作、能否开发Html5离线网络应用程序】按常理Html5开发出来的是Web网页应用,则需网络连接才能下载并使用,作为Html5对离线应用开发的支持最大的特殊,支持离线需要满足如下条件:离线资源缓存:...
  • HTML5+、mui开发移动app

    万次阅读 2016-07-13 17:46:01
    跨平台移动APP开发进阶(二)HTML5+...通过HTML5开发移动App时,会发现HTML5很多能力具备。为弥补HTML5能力的不足,在W3C中国的指导下成立了www.HTML5Plus.org组织,推出HTML5+规范。 HTML5+扩展了JavaScript对象pl...
  • HTML5plus 移动 App开发入门

    万次阅读 2014-07-11 11:24:28
    HTML5plus 移动 App开发入门   ...通过 HTML5 开发移动 App 时,会发现 HTML5 很多能力具备。为弥补 HTML5 能力 的不足,在 W3C 中国的指导下成立了 www.HTML5Plus.org组织,推出 HTML5+规范。
  • 转自:http://www.cnblogs.com/iamjiuye/archive/2013/04/10/3012381.html
  • HTML5中新增的input类型及其属性

    万次阅读 2017-02-22 11:48:44
    HTML5中新增的input类型及其属性HTML4.01中,input的类型只有text、button、password、submit、radio、checkbox和hidden(隐藏域)。H5中新增了一些类型,使用起来更加方便,包括: color 点击时弹出颜色选择器,...
  • HTML5中的新国际化标签及属性

    万次阅读 2017-04-14 17:20:39
    H5问世其实也有很长一段时间了,时至今日,大部分浏览器都号称对其进行了支持,但...闲言少叙,本文就来谈谈HTML5 + CSS3中的新国际化标签及其使用情况,以及可能带来的风险分析吧。 一定会有人惊呼,lang一直都有啊
  • 10个H5页面制作工具,功能全面评测

    万次阅读 2016-07-22 20:31:14
    目前市面上各种H5页面制作工具,其中既有滥竽充数的,也有真材实料的。但是怎么区分呢?其实最简单的办法就是看案例,也就是用这些H5页面...以下是笔者浏览了近万个优质案例后,总结出来的各大H5页面制作工具对H5种类的
  • HTML5 本地存储 localstorage 安全分析

    万次阅读 2012-07-11 09:49:12
    HTML5本地存储出现以前,WEB数据存储的方法已经有很多,比如HTTP Cookie,IE userData,Flash Cookie,Google Gears。其实再说细点,浏览WEB的历史记录也算是本地存储的一种方式。到目前为止,HTML5本地存储方式...
  • Html5+Css3实现类似网易云音乐的移动版播放器

    万次阅读 多人点赞 2016-02-21 21:56:57
    网易云音乐的网页版是没有移动页面的,我突发奇想,来做一个玩玩: http://followyourheart.sinaapp.com/Demos/musicPlayer/Index.html 主要用到了Html5的一些Api跟Css3动画,仅供参考。
  • HTML5HTML4的区别

    千次阅读 2016-06-11 19:13:37
    但由于翻译时草稿只发布了到二十天,本文有很好的时效性。也作为比较性质的文献,比起HTML5的标准它更容易理解,可以让人快速地理解HTML5的变化轮廓。 关于本翻译: 原文所有指涉HTML5的地方用的要么是无...
  • 什么是 HTML5HTML5 是最新的 HTML 标准。HTML5 是专门为承载丰富的 web 内容而设计的,并且无需额外插件。HTML5 拥有新的语义、图形以及多媒体元素。HTML5 提供的新元素和新的 API 简化了 web 应用程序的搭建。...
  • 我想,我并赞同《瓦尔登湖》中讲的那样,倘若只有自己,谁愿意过那样的生活呢。打工去买车票是一个正常人,而行走去旅行那么异类的事,爸爸妈妈怎么办哎?好困哎,我要休息啦!!! 2018.10.14
  • HTML5 Device API相关规范的解惑

    万次阅读 2012-03-09 19:25:43
    HTML5中,Device API相关内容众多,而且结构比较复杂,内容有所重叠,大家在使用时可能会遇到许多问题,下面我针对这些问题谈一下个人的理解。1、The Media CaptureAPI VS System Information API,两者都可以访问...
  • 最近关于HTML5 吵得火热,很多人认为HTML5出现会秒杀Flash,以至于在各大web前端开发论坛吵得不可开交。论坛里三言两语说的不够 尽兴,只好在自己一亩三分地里敞开了说说。也当一次神棍,展望一下web前端开发...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 196,616
精华内容 78,646
关键字:

以下不属于html5功能的是