Posted on 30-10-2015
Filed Under (技术) by waterlin

MPEG-4 Part 2 或是 MPEG-4 Visual 是指 MPEG4 标准集里有关视频/可视化物体编码的部分。MPEG-4 Part10 是指 H264 或是我们平常说的 AVC。H264 是由ITU-T 和 MPEG 联合开发的:H264 是 ITU-T组织的叫法,MPEG-4 AVC 是 MPEG 组织的叫法。

MPEG4 Part2 编码器的主要实现有:DivX, Xvid,H264 编码器的实现主要有 x264 等。

两者的编码方法和原理有着本质的不同, part2 是使用了分层的 object 模型来进行数据压缩的,而 H264 更多的是宏块的计算与偏移。由于 part2 和 part10 这样的名称原因,并且都是用于视频压缩,很多人会想当然地以为 part10 是 part2 的改进,但是实际上 part10 和 part2 没半毛钱关系,完全是两个东西。

Part2 的目标是用来编码不同种类的可视化物体如视频、3D 模型等,而 part10 的目标则单纯得多,就是为了提供一种高效率和高质量的视频编码标准。

可以这么说,H264 是为了降低 MPEG-4 Part2 的码率而诞生的,用它压缩的视频,在同样的效果下有着更低的码率。在互联网应用以及高清视频下,H264 是一个更好的选择。在现在的当下,对于视频压缩来说,基本上都是选择 H264,因为有着更高的压缩效率、更多的硬件支持、更多的平台支持、更多的开源项目。

另外,对于大多数人喜欢笼统地说“使用 MPEG-4 编码的视频”,一般来说,是指使用 MPEG-4 Part2 来编码的视频。出于习惯,人们喜欢把 MPEG-4 Part2 直接称为 MPEG-4。由于历史原因,这个在广播电视里用得比较多。

一般来说,碰到类似含糊不清的句子,你可以强调地问一句:是使用 part2 还是使用的 part10 来压缩视频的?

MPEG4 标准还提供相关的很多其它部分,比如说 Part 12 和 Part15 就是定义了一种名叫 .mp4 的文件格式,用来存放 Part10(即H264)的视频内容和 Part3(例如 AAC) 的音频内容。

(0) Comments    (422) Views    Read More   
Posted on 01-06-2015
Filed Under (技术) by waterlin

以下示例声明了一个指向 float 的指针:

float *powerPtr;

因为 powerPtr 变量的类型是指向 float 的指针,所以读者可能会将代码写成:

float* powerPtr;

这样写没有问题,编译也会通过,但不是好的代码风格。

C语言允许在一行代码中声明多个变量。例如,要声明变量 x、y和 z,可以将代码写成:

float x, y, z;

以上三个变量的类型都是 float。

再看下面这段代码,b 和 c 变量分别是什么类型?

float* b, c;

答案可能会出乎读者的意料。b 是指向 float 的指针,但 c 的类型却是 float。如果需要将 a 和 b 都声明为指针,就必须在每个变量前都加上*:

float *b, *c;

在这种情况下,将 * 写在变量名这边,能让声明看上去更清楚。

摘录自《Object-C 编程》122页。

(0) Comments    (825) Views    Read More   
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    (533) Views    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    (578) Views    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    (697) Views    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 就有关键帧了,即可进行拖动播放操作。

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,这个可以用在客户端上来进行推流操作。

Posted on 29-04-2015
Filed Under (技术) by waterlin

一、先介绍一个基本的移动端采集音频模块

OpenSL ES :嵌入式音频加速标准

OpenSL ES™ 是无授权费、跨平台、针对嵌入式系统精心优化的硬件音频加速API。它为嵌入式移动多媒体设备上的本地应用程序开发者提供标准化、高性能、低响应时间的音频功能实现方法,并实现软/硬件音频性能的直接跨平台部署,降低执行难度,促进高级音频市场的发展。

二、再介绍一些常用的音频格式

SILK: Skype 里使用的一种音频格式。这个格式的 SDK 可以从网上下载,不过有版权保护,只允许用来做测试与研究,如果需要在产品里使用,估计还是得取得授权。这个基本上是基于语音对话来设计的质量,对讲话的录音效果还可以,但是对于音乐等来说,效果不太好。

Speex: 已经不再维护,官方建议使用 Opus 来代替。

Opus: 基本上可以说是为网络而生的音频格式,支持网络电话、视频会议以及游戏里的音频对讲等场景。Opus 是由 SILK 发展而来。

AMRWB: Adaptive Multi-Rate Wideband, Nokia 和 VoiceAge 联合开发的一个音频格式,最开始是在 3GPP 里使用。

AAC:这个不用多介绍了吧,几乎是现在最常用的音频格式了,当初主要是用在 Mp4 里的。

HE-AAC:又叫 EAAC+,是 AAC 的改进版本,基本上是现在效果最好的库了。

(0) Comments    (460) Views    Read More   
Posted on 22-04-2015
Filed Under (技术) by waterlin
  1. Maven 会把你依赖的库下载到 ~/.m2 文件夹里,在硬盘里仔细找找。
  2. 如果 Maven 拿不到相关的依赖文件,仔细检查一下 ~/.m2/settings.xml 文件,看究竟有没有错误。
  3. 如果你的代码都写好了,想测试一下相关依赖库等是否正常、能否正常编译,可以使用下面的命令来进行编译:
    mvn package -Pdev
    

    如果你们团队有构建服务器,则上述命令的运行应该和服务器上的构建是等价的,在服务器上构建之前,可以使用这个命令来进行构建测试。

  4. Maven 的基本用法及概念参看这里
  5. 配置好了 pom.xml 文件后,以后需要引用第三方库,直接在 pom 文件里配置即可。还有一种情况,如果别人临时编译了一个版本给你要测试,怎么办?这时可以直接把库文件放到本地相应的 libs 目录里,有一些编辑器如 Android Studio 会优先采用本地的库文件。
  6. 如果用 Maven 来构建 Android 工程,可以参看 Android Example Maven Project 这个例子来构建工程。不过现在好像都推荐使用 Gradle 来构建 Android 工程了。
(0) Comments    (517) Views    Read More   
Posted on 09-04-2015
Filed Under (技术) by waterlin

Spydroid 是一个可以让 Android 手机变成音视频采集终端的 App,其中核心功能由 libstreaming 库提供。

技术上的主要实现原理:

  1. 使用 Android 的 MediaRecorder API 来录制音视频为 mp4 文件,然后通过这个 mp4 文件来生成 rtsp 流。这样做,只能做到图像与声音大致同步,尤其是人说话的时候音画同步的问题会特别明显;这种方式对于网络抖动的处理也不是特别好。
  2. 通过 MediaCodec API 来获取视频流的未压缩数据,然后通过自己的编码器,来生成视频流。这个和传统的多媒体视频流思路一样,比较容易控制,但是对 Android 系统的版本有要求,系统版本最低最好不要低于 4.0。

这个库的使用方式主要有两种:

  1. 把 libstreaming 当作 rtsp 客户端来使用,并且植入 Wowza Media Server,这样就可以从手机上获取实时视频流,并让 Wowza Media Server 分发出去,从而实现在网页上观看手机采集的音视频流功能。
  2. 把 libstreaming 当作一个 rtsp 服务器,这样通过 VLC 或是其它 rtsp 流播放器,可以观看当前手机摄像头的音视频流媒体内容。
(0) Comments    (655) Views    Read More