Posted on 09-12-2017
Filed Under (技术) by waterlin

Windows 下用 Python3 和 OpenCV3.3.1 来写算法,在生成 H.264 的视频的时候,碰到提示这样一个错误:

两个解决办法:

1. 修改生成视频的编码器类型,不要用 acv1 编码器,比如说可以试试 XVID 编码器。

2. 去 openh264 下载对应的版本,放到 PATH 目录里,这样让 python 能够正常加载这个动态库。

比如在我这里,就去下载 openh264-1.6.0-win64msvc.dll.bz2 这个版本,然后放到一个 PATH 包含的目录里,让这个库能正常加载。

如果你成功加载了这个 openh264 库后,即可在终端输出里看到这样的一句话:

这样就能在 Windows 下用 Python3 + OpenCV3.3.1 来生成视频了。

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

在 Windows 下,如果需要使用 OpenCV、Dlib、Python3 来进行一些算法开发,整个环境配置起来还是有点麻烦的,摸索了一下,记录一下安装步骤。

1. 安装 cmake

直接从官方下载一个版本安装即可。

2. 配置 Boost 开发环境

Boost 的官网下载一个你需要的版本号,对于我这次来说,我下载的是 1.63 版本(需要和第3步里的 Boost Python接口版本号对应上),具体的安装方法可以参看这个教程。简单来说,就是在 Boost 的解压目录里,用下面的命令来编译 Boost 库:

安装好以后,需要设置对应的 Boost 的 Windows 环境变量:

3. 安装 Python 3.6 版本以及对应的 Numpy、SciPy、OpenCV 等工具库

对于 Windows 下,安装 Python3.6 很简单,从官方下载安装包安装即可。但是对于 Python 依赖的工具包,有的时候,安装起来就会比较麻烦。对于 AI 或是科学计算经常使用的库,比如说 numpy、SciPy 等,最好通过 Unofficial Windows Binaries for Python Extension Packages 下载对应的包来安装。

比如,对于我们的 Windows 和 Python3.6 版本来说,我就选用对应的 64 位版本来进行安装:

注意看一下 Boost 的版本号需要和第二步里的版本号对应上。

安装的命令很简单,比如说对于 numpy 来说,使用这个命令就可以了:

3. 编译和安装 dlib

下载 dlib-19.7 源代码包解压,再从 cmd 进去,如果上述配置正确的话,应该可以用下面的命令来进行自动编译和安装:

在这里的时候,我碰到一个问题,因为我的 Windows 是中文版本的系统,所以在运行上述命令的时候,提示了这么一个错误:

这是因为中文操作系统中 cmd 编码为 GBK 而不是 UTF-8 ,从而导致 Python3 编码错误的问题,安装前先修改 setup.py 文件,把第 274行的 sys.stdout.encoding 改成 GBK:

4. 安装 dlib Python 扩展包

最后,上述步骤完成后,再用

来安装 dlib。

上述步骤如果一切正确,现在就可以在 Windows 上正常的使用 dlib 库来做算法分析了。

(0) Comments    Read More   
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    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 后,配置文件在这里:

(2) 启动 nginx 的命令:

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

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

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

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

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

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

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

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

3. HLS 直播流的配置

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

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

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

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

(1) 用 rtmp:

(2) 用 hls 播放:

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

4. 网页播放器插件

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

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

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

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

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

意思是将 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 流,可以有多个方法,比如说使用 FFmpeg 从视频文件里读取流并推送到指定的 RTMP 地址:

或者你可以使用 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一节。

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

就基本上可以使用

来测试 HLS 和 RTMP 流。

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

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

(0) Comments    Read More