Posted on 21-05-2015
Filed Under (技术) by waterlin

增强现实(以下简称 AR)在三四年前是非常热闹的一个移动 App 发展方向,可是过了这么多年,现在依然是不愠不火,不管是商业上还是技术上,感觉也没有什么太大的突破。把之前的旧笔记整理一下,分享给大家,感觉接下来类似的应用在中国多少会有一点突破啊,起码是一个不错的信息载体和发现平台。

1. 标识识别类 AR 应用

  • Junaio,AR浏览器,准备作为一个 AR 的展示出台
  • int13,专门制作 AR 游戏的厂商
  • apetrus argirl,专门制作游戏的厂商
  • iButterfly,在屏幕实景上显示出蝴蝶,娱乐产品

2. 地理信息类 AR 应用

有一些 AR 应用,显示的内容都是基于 LBS 技术的应用,只不过展示用的是 AR 技术。

  • Layer,详情可以查看这篇文章
  • Wikitude

    根据手机的 GPS 坐标获取相应的 POI 信息,还可以指定从几个网站获取相应的 POI 信息;Wikitude 类似 Layar 的系统架构,提供内容频道。

    但是系统模型不如 Layar 科学,数据内容也不如 Layar 丰富。

    提供 Android,iPhone, Symbian 平台客户端。还提供了一个 SDK,可以集成到自己的 AR 应用里,还是基于地理位置的 AR SDK。

  • TagWhat
  • Augmented Car Finder,增强现实技术的停车场汽车查找器

3. 与硬件搭配的游戏

  • ARDrone

    AR Drone这款玩具,相信对有的童鞋来说已经不是什么新鲜事了。早在年初拉CES 2010(国际消费电子展)上,由法国巴黎的 Parrot 公司展示了这款能用 iPhone 操作的直升机玩具就大放异彩夺得电子游戏硬件创新奖。

    这款遥控直升机通过 4 个螺旋桨飞行,而机身上的摄像头可以让玩家透过屏幕,实时观赏沿途飞行的风景。通过 Wifi 连接到 iPhone 或者 iPod Touch,控制 AR Drone 作出各种飞行动作。而通过其摄像头以及 AR 技术实现的多人虚拟对战游戏功能,在屏幕上直升飞机前会出现虚拟的敌人(屏幕上看到的游戏场景是真实的摄像头拍摄场景与虚拟环境的叠加),可以让玩家有逼真的空战体验。Parrot 还开放了开发平台,希望更多的开发商参与到 AR Drone 的发展,带来更多不同体验的有趣游戏。

(0) Comments    Read More   
Posted on 21-05-2015
Filed Under (技术) by waterlin

Layer 是一个增强现实应用 App,应用手机的摄像头及罗盘等定位功能,实现一个增强现实的场景,现在就简单介绍一下我对这个产品的使用体会。

1. Layar 特点分析

Layar 有付费内容,可以设置过滤条件。

Layar 可根据视角及相关点坐标读取 Twitter 信息,有距离数与手机持有人的距离数。

允许相关内容制作方参与制作,以插件的形式提供内容;开放 API,允许第三方制作插件,即成为内容提供商;可以添加图层,每一件插件其实是一个图层,可以收藏图层;允许在实景及地图模式里进行切换;Layar 提供地图及用户坐标数据,而让内容提供商决定显示的内容。

Foursquare 在它上面建立了应用,Yelp 也是。

2. Layar 的几大特征

  1. 实景上的 3D 按钮;
  2. 与手机持有人很接近的点,会有特征的图像显示,比如说复活节的蛋;
  3. 可以给各个数据点添加 Audio 信息,即类似流媒体的功能;
  4. 有用户名注册机制,这样可以形成类似于社会化分享的网站功能;
  5. 制作 Layar 内容并不需要付费,成为第三方工具开发者也不需要授权费;
  6. 允许第三方内容提供商制作付费内容;
  7. 在 Layar 平台上还可以构建相应的开发平台,允许第三方进行合作,开发框架;
  8. Yelp 与 Foursquare 有自己的客户端,但是并不具备增强现实的功能,增强现实的功能只能通过 Layar 的插件形式给予提供。
(0) Comments    Read More   
Posted on 13-05-2015
Filed Under (技术) by waterlin

先介绍一下什么叫 MJPG。

Motion JPEG (M-JPEG 或者 MJPEG) 算法其实就是对于视频序列采用 JPEG 压缩算法,从而生成一个序列的 JPEG 图像视频帧,通过这种方式,来实现视频压缩的方法。这个方法大量存在于一些视频非线性编辑器、摄像头设备上。

这种方式只有帧内预测而没有帧间预测,虽然需要大量的存储空间和带宽,但是也有一些优点:

  1. 相比于 H.264 这些,只需要很少的计算量就可以进行压缩,算法简单,因此在一些低端设备里,可采用此类方法来生成视频序列。
  2. 对画面里的剧烈运动内容不敏感,即剧烈运动的时候,也不会导致图像太模糊。相比之下,对于 H.264 这些有帧间压缩的算法,对于剧烈运动的场景,在码率并没有提高的情况下,视频的质量肯定会变差。
  3. 因为各个帧都是独立存在的,所以可以很方便地对视频进行编辑操作,计算量很小。

缺点:

  1. 打包 M-JPEG 的容器标准并不统一,也没有一个标准,所以比较混乱;
  2. 因为采用 JPEG 压缩算法,所以很费带宽,甚至效果还不如 JPEG2000 算法来得高效。

MJPG-streamer 是一个可以从本地摄像头读取视频数据,然后生成 MJPG 序列的应用程序,生成的 MJPG 可以给大多数浏览器或是播放器使用。

(0) Comments    Read More   
Posted on 12-05-2015
Filed Under (技术) by waterlin

使用 nginx 和 rtmp 模块,可以很容易地搭建一个视频直播和点播服务器出来。

首先,看一下最经典的参考文献:How to set up your own private RTMP server using nginx

1. 安装 nginx 和 rtmp 模块

有关 nginx 的编译和安装比较简单,这里就不介绍了,看参考文献。这里提示以下几点:

(1) 安装好 nginx 后,配置文件在这里:

/usr/local/nginx/conf/nginx.conf

(2) 启动 nginx 的命令:

$ sudo /usr/local/nginx/sbin/nginx -s stop
$ sudo /usr/local/nginx/sbin/nginx

2. 配置 nginx 视频直播和点播服务

先看一下完整的 nginx 配置文件里有关视频点播和直播的配置:

rtmp {
        server {
                listen 1935;
                chunk_size 4096;

                application live {
                        live on;
                        record off;
                }

                application live2 {
                        live on;
                        record off;
                }

                # video on demand
                application vod {
                        play /var/flvs;
                }

                application vod_http {
                        play http://192.168.31.185/vod;
                }

                application hls {
                        live on;
                        hls on;
                        hls_path /tmp/hls;
                }
        }
}

# HTTP can be used for accessing RTMP stats
http {

    server {

        listen      8080;

        # This URL provides RTMP statistics in XML
        location /stat {
            rtmp_stat all;

            # Use this stylesheet to view XML as web page
            # in browser
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            # XML stylesheet to view RTMP stats.
            # Copy stat.xsl wherever you want
            # and put the full directory path here
            root /path/to/stat.xsl/;
        }

        location /hls {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
        }

        location /dash {
            # Serve DASH fragments
            root /tmp;
            add_header Cache-Control no-cache;
        }
    }
}

现在来解释一下里面各行代码的含义。对于视频直播服务,如果需要支持多路流输入的话,很简单,在 nginx 配置文件里多配几个 Application 就只可以了,像下面这样:

application live {
        live on;
        record off;
}

application live2 {
        live on;
        record off;
}

这样就可以通过下面的地址来推送直播流,其它观众端也可以通过下面的地址来访问直播流:

rtmp://192.168.31.185/live/test
rtmp://192.168.31.185/live2/test

后面紧跟的 test 关键字,可以随便更换,只要你的推送流和访问流的地址一样就可以了。

rtmp 模块也可以直接支持 VOD 这种视频点播服务,只需要在配置文件里添加如下内容即可:

# video on demand
application vod {
    play /var/flvs;
}

application vod_http {
    play http://myserver.com/vod;
}

然后把一个 mp4 或是 flv 文件扔到 /var/flvs 目录下,对于 /var/flvs/dir/file.flv 这个视频文件,就可以通过下面的网址来访问了:

  http://myserver.com/vod//dir/file.flv

这样直接在浏览器里就可以通过网页观看视频。对于 mp4 文件,也可以实现 VOD 服务,不过需要的是采用 H.264 和 AAC 格式编码的 mp4 文件。

3. HLS 直播流的配置

如果需要使用 HLS 来视频直播,可以直接像配置文件那样,写上下面这一段:

application hls {
        live on;
        hls on;
        hls_path /tmp/hls;
}

同时把后面有关 http 访问的内容写上:

# HTTP can be used for accessing RTMP stats
http {

    server {

        listen      8080;

        # This URL provides RTMP statistics in XML
        location /stat {
            rtmp_stat all;

            # Use this stylesheet to view XML as web page
            # in browser
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            # XML stylesheet to view RTMP stats.
            # Copy stat.xsl wherever you want
            # and put the full directory path here
            root /path/to/stat.xsl/;
        }

        location /hls {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
        }

        location /dash {
            # Serve DASH fragments
            root /tmp;
            add_header Cache-Control no-cache;
        }
    }
}

配好以后,推流可以使用下面的地址:

rtmp://192.168.31.185/hls/movie

movie 关键字可以任何替换。对于观众端来说,可以有几种播放方式:

(1) 用 rtmp:

rtmp://192.168.31.185/hls/movie

(2) 用 hls 播放:

http://192.168.31.185:8080/hls/movie.m3u8

这样就可以看到主播端推出来的流。注意,如果使用 http 方式,则是监听的 8080 端口,这个是在配置文件里写的。

4. 网页播放器插件

在第二步里,除了可以直接在浏览器里打开网址来观看视频,还可以写一个网页,实现像优酷那样的视频点播业务。通过使用第三方的播放器,在网页里植入该播放器来实现这个功能,比如说使用 JWPlayer 播放器。

下载 JWPlayer 播放器,放到 nginx 网页服务的根目录,比如说,在我这儿是 /usr/local/nginx/html 这个目录,把 JWPlayer 解压后放到这个目录里,然后在这个目录里新建一个 play.html 的文本文件,再写入以下内容:

<html>
  <head>
    <script src="/jwplayer/jwplayer.js"></script>
  </head>

<body>
  <div id='my-video'></div>
  <script type='text/javascript'>
    jwplayer('my-video').setup({
      file:'http://192.168.31.185/vod/North.mp4',
      fallback:'false'
    });
  </script>
</body>
</html>

对于 flv 文件,可以采用如下的形式来实现网页播放:

<html>
  <head>
    <script src="/jwplayer/jwplayer.js"></script>
  </head>

<body>
  <div id='my-video'></div>
  <script type='text/javascript'>
    jwplayer('my-video').setup({
      file:'http://192.168.31.185/vod/1.flv',
      width:'50%',
      aspectratio:'3:2',
      fallback:'false',
      primary:'flash'
    });
  </script>
</body>
</html>

这样,当你打开 http://192.168.31.185/play.html 这个网页时,就能看到 html 里指定的视频文件。

另外,如果有一些 flv 文件没有办法拖动播放,那是因为没有给 flv 文件添加“关键帧”,可以用工具“yamdi” 和“flvtool”来给 flv 生成关键帧,以 yamdi 为例,下载解压后从 shell 执行:

yamdi –i src.flv –o dst.flv

意思是将 src.flv 添加关键帧,并输出为 dst.flv 。这样 flv 就有关键帧了,即可进行拖动播放操作。

(1) Comment    Read More   
Posted on 08-05-2015
Filed Under (技术) by waterlin

有关 RTMP、FMS、HLS 等概念,可以参看 Adobe Flash Media Server 使用的基本概念一文。

使用 Simple RTMP Server (以下简称 SRS)可以对 RTMP 流进行分发,实现当下非常流行的视频直播功能。记录几个小细节,以便以后翻阅。

1. SRS 的安装非常简单,只需要按照文档一步一步做即可

根据配置好的 RTMP 地址,直播流生产者和消费者都使用同一个地址来推送流和观看流(需要把 IP 换成实际的 IP 地址):

rtmp://192.168.1.170/live/livestream

至于如何生成 RTMP 流,可以有多个方法,比如说使用 FFmpeg 从视频文件里读取流并推送到指定的 RTMP 地址:

D:\OpenSource\ffmpeg\bin>ffmpeg.exe -re -i G:\movie\source.200kbps.768x320.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.31.185/live/livestream

或者你可以使用 OBS/XSplit/FFSplit 之类的软件来推流。

2. 为什么使用 RTMP 流而不使用其它的 RTSP 或是 HLS 之类的方式呢?

主要是 RTMP 的延时低、浏览器里支持好等决定的,详情查阅 RTMP 与 HLS 分发方式的对比

RTSP 主要使用在安防领域,在互联网上使用不广。要知道当初 RTMP 流行起来,主要拜 YouTube 所赐,慢慢地也就成了事实上的工业标准,大部分的浏览器都可兼容这个协议,从而使得在浏览器里浏览视频变得统一。一旦事实的标准形成,就很难再给其它协议机会了。

补充一个 RTMP 与 RTSP 的区别:

The Real Time Streaming Protocol (RTSP) is a network control protocol designed for use in entertainment and communications systems to control streaming media servers. The protocol is used for establishing and controlling media sessions between end points. Clients of media servers issue VCR-like commands, such as play and pause, to facilitate real-time control of playback of media files from the server.

Real Time Messaging Protocol (RTMP) was initially a proprietary protocol developed by Macromedia for streaming audio, video and data over the Internet, between a Flash player and a server.

RTSP 一开始就是一个公开的标准,而 RTMP 最早是 Adobe 制定的、后来才开放的标准。

像 Android 手机啥的,一般都支持 RTSP 流的播放;而对于 RTMP,则可能需要自己开发。RTMP 主要的优势是 Flash Player 的支持比较好,从而可以轻松地在浏览器里观看。

HDS/HLS 在 PC 上如果使用客户端来看,都需要库支持,折腾起来很麻烦。

HLS 和 RTMP 两种分发方式,就可以支持所有的终端。

HLS 作为流媒体协议非常简单,Apple 支持得也很完善。Android 对 HLS 的支持也会越来越完善,现在也有专门的公司在 Android 上开发 HLS 播放器。

3. SRS 应该使用了 FFmpeg 等多个库来作为支撑,在编译的时候需要指定相应的编译参数

SRS 有大量的编译选项,这个可以通过不同的参数来配置,比如说 FFmpeg 这些就需要通过 –with-ffmpeg 参数来 configure 一把,才会编译出来。参看编译SRS一节。

比如说使用下面的配置命令:

./configure --rtmp-hls --with-http-api --demo --with-ffmpeg
make

就基本上可以使用

./scripts/run.sh

来测试 HLS 和 RTMP 流。

4. SRS-librtmp 方便编写推流客户端

据 SRS 说,原本的 librtmp 库很烂,所以它提供了一个更好的实现:SRS-librtmp,这个可以用在客户端上来进行推流操作。

(0) Comments    Read More