使用nginx实现视频点播

文档

使用 play 相关的指令可以实现点播功能。相关命令:

  • play
  • play_temp_path
  • play_local_path

配置

使用play命令可以点播mp4和flv文件。文件路径支持本地目录和http指定的url路径。

1
#本地文件
application vod {
    play /var/flvs;
}

#网络中的文件
application vod_http {
    play http://myserver.com/vod;
}
  • play 指令中可以指定多个文件路径

  • 多个play指令的时候,会合并指令中的位置。在播放的时候会在这些路径列表中的文件夹下依次查找,查不到,就会给前端返回一个错误。

  • mp4 文件需要 采用 H.264 和 AAC 格式编码。

  • flv文件点播需要添加关键帧(可以使用yamdi添加),record 指令生成的文件没有关键帧。

当播放一个网络文件时,nginx会先把文件下载完,然后才播放。下载文件临时存放的位置由play_temp_path指定,默认是存在/tmp文件夹下。另外,可以使用 play_local_path指令,把下载的文件复制到本地,配合play指令可以指定多个路径列表的特点,提高性能,不用是ngx每次都去下载网络视频资源。

配置更改如下即可实现点播url指定的文件,同时可以将文件缓存再本地,提高性能。

1
#网络中的文件
application vod_http {
    play_local_path /tmp/videos;
    play /tmp/videos http://example.com/videos;
}

添加关键帧

yamdi –i src.flv –o dst.flv

yamdi 文档

点播视频

可以使用ffmpeg自带的ffplay

ffplay rtmp://localhost/vod//dir/file.flv

【译】How to set up your own private RTMP server using nginx

如何使用nginx搭建一个私有的RTMP服务器

原文地址: https://obsproject.com/forum/resources/how-to-set-up-your-own-private-rtmp-server-using-nginx.50/

大多数人喜欢使用Twitch.tv和Ustream这类服务把流视频转播放给用户,并且工作的也非常好。但是有时候你想对你的流视频有更多的控制权,或者你想其他人把视频流转发给你,或者你想转发视频流到多个地方,或者一些事情需要你有权限访问RTMP服务器上的视频流。这篇教程内容非常基础,教你在一台linux服务器上搭建一个简单的RTMP服务器。

在你自己RTMP服务器上,你可能感兴趣去做的是这两件事情:

  • 向多个频道播放内容
  • 由于一些目的,把其他人的多个视频流合成一个(我在多个角度拍摄中使用它,例如像在这个多个拍摄角度视频中

好的,你该怎样做到这些事情呢?

第一步:获取一个服务器

不管你信不信,RTMP 实际上对系统资源要求十分的小。本质上来说,它仅仅是从输入端抓取数据并把数据转发到输出端,简单的数据传输。不相信我?我的运行了很长一段时间的RTMP服务器是一个树莓派,一个价值35美金(月200元人民币)的迷你计算机,就放在我的办公桌上,至少同时处理3个数据输入流是完全没有问题的,我也从来没有对它进行过压力测试去看看到底他能处理多少。因此,我向你保证,即使一个便宜的旧机器也是完全没有问题的。

加入你没有树莓派,一个vps也是可以的。我推荐Linode服务商,加入你能支付的起服务费用。我现在也在使用,并且到现在为止,它也运行良好。仅仅确保你有足够的带宽。。。记住带宽的使用量是(视频流的大小)* (上传人数+下载人数)。因此当我有两个视频流推送视频流到我的服务器,并且我同时下载他们,两小时消耗了10GB的带宽流量。

为了方便,我推荐使用Ubuntu作为服务器软件,但是你完全可使用任何你想使用的。只要你能从apt之外其他的地方解决nginx的依赖问题,你就能参考这篇文档。

Windows 用户注意 这边教程关注Linux上的使用,加入你想在Windows上使用,你能找到带有RTMP 模块的nginx二进制包,在这个地方: http://nginx-win.ecsds.eu/

加入你的服务器在你家里,你需要转发TCP 1935端口数据到这个服务器上。。。不同的路由器有不同的设置,因此你需要根据你自己的路由器,查看怎么设置端口转发。同时,我推荐使用 DynDNS 这类服务去克服家用主机动态IP的问题。

第二步:安装nginx 和RTMP 模块

登录你的机器,并且确保你有这些必须的工具去编译nginx,执行下面的命令

$ sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev

现在说点关于nginx的一点小知识(发音 “engine-X”)。nginx是个轻量级的web server,
但是有些人为它写了一个RTMP模块,因此它能够提供RTMP流相关的服务,为了添加这个RTMP模块,我们必须重新从源码编译nginx 而不是使用apt包。不要担心,它是非常简单的,仅仅执行下面的指令:)

在你的home目录,下载nginx 源码:

$ wget http://nginx.org/download/nginx-1.7.7.tar.gz

在写这篇文章的时候,ngxin 最新的稳定版本是 1.7.7。你可是从(nginx 下载页)[http://nginx.org/en/download.html]下载最新的包。

接着,从git 获取RTMP 模块的源代码

$ wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

解压开他们,斌且进入nginx 目录:

1
$ tar -zxvf nginx-1.7.7.tar.gz
$ unzip master.zip
$ cd nginx-1.7.7

现在,编译nginx:

1
$ ./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
$ make
$ sudo make install

现在nginx 安装完毕了!默认安装在了 /usr/local/nginx,使用下面的命令启动:

$ sudo /usr/local/nginx/sbin/nginx

现在测试一下确认nginx 正在运行,打开浏览器输入 http://服务器ip/ 然后你将看到”Welcome to nginx!”这个页面。

第三步:配置nginx 启用RTMP

打开配置文件,默认在 /usr/local/nginx/conf/nginx.conf,在文件的最后添加下面的内容:

1
2
3
4
5
6
7
8
9
10
11
rtmp {
server {
listen 1935;
chunk_size 4096;

application live {
live on;
record off;
}
}
}

这是一个非常简单的基础配置,有一个live应用,它将会把RTMP视频流转发给所有请求这它的用户。你可能过一会才播放这个视频。这里是所有配置选项,展示了如何转发视频流到其他的地方(像Twitch),保存上传的记录,输出状态,等等。。

重启nginx:

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

第四步:测试

你的服务器应该能接受RTMP视频流了。让我们尝试一下吧。
创建一个新的工程在OBS,并且更改 Broadcast Settings 为如下:

1
Streaming Service: Custom
Server: rtmp://<your server ip>/live
Play Path/Stream Key: test

你可能会对test路径从哪里来的产生疑惑。好吧,我们就是刚刚穿创建的。你能创建任何路径和流,并且把那个路径发到RTMP播放器里面,并且并且它将重放。出于简单的目的,授权是没必要的。然而,授权是可以支持的,后面再做介绍。

你现在能向你的服务器推送视频流了。你点击了 “Start Streaming” 并且没有报告错误,这是一个好的信号。

怎么打开观看呢?
vMix
使用vlc: rtmp:///live/test

现在做什么呢?

你能使用使你的服务器转发视频流到其他的流服务和频道。在”record off;”后面添加下面的指令。

push rtmp://<other streaming service rtmp url>/<stream key>

任何视频流都会被转发,同时会转发个客户端,你可以添加多个push指令。

FAQ

写blog的好处

  • 积累
    经验的积累,知识的积累,有些东西,过段时间后,就会遗忘,而写则会加深理解,
  • 参考
    方便为日后给自己参考,也给其他人可以做一个参考
  • 加深理解,训练逻辑
    在写blog的时候自己又重新思考了一边,逻辑思维上训练了一边,训练自己的表达能力,逻辑思考能力

PHP文件上传

上传一个213M的文件的时候一直报IOerror。首先想到的是php上传文件大小的限制,改为300兆后,不起作用,就感觉是上传的的时候脚本执行的时间太长了,就修改max_input_time 为6000 还是不起作用,琢磨是不是max_input_time解析数据的时间出了问题,最后发现也不是,原来是nginx设置的太小了,改为500m,问题立马解决了。

php 和 nginx 设置如下

ngxin server 里面配置如下

1
2
3
4
5
server{
***
client_max_body_size 1000M;
****
}

php.ini 配置如下

1
2
3
4
5
6
7
8
file_uploads = On ;是否允许通过HTTP上传文件的开关。默认为ON即是开
upload_max_filesize = 500M ;上传文件上限
upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹。
如果要上传比较大的文件,仅仅以上两条还不够,必须把服务器缓存上限调大,把脚本最大执行时间变长
post_max_size = 500M ; POST给PHP的所能接收的最大值
max_execution_time = 30 ; 每个PHP页面运行的最大时间值 Maximum execution time of each script, in seconds脚本最大执行时间
max_input_time = 60 ; 每个PHP页面接收数据所需的最大时间 解析一次请求时间上线 Maximum amount of time each script may spend parsing request data
memory_limit = 128M ; 每个PHP页面所吃掉的最大内存 内存上限 Maximum amount of memory a script may consume (128MB)

相关参数解释

参考

http://www.jb51.net/article/18975.htm
http://www.360doc.com/content/13/1210/11/14452132_336027836.shtml

erlang 笔记

并发难点

  • 共享内存 数据污染

  • 消息模型,异步io

第二章

快速入门

安装、基本使用、基本的数据结构,操作,语法、快速入门

变量与其他语言的不同地方

模式匹配
通配符

整数、浮点数、原子、元组、列表、字符串、字符集、

第三章

顺序编程初步

程序如果切分的话可以分成数据(结构),及对其操作、(数据)类型之间的转化,还有流程控制

  • 模块
  • 函数

  • 控制抽象、高阶函数

  • 断言 when
  • 记录
  • 控制结构: case if
  • 简单列表处理、列表解析
  • 算术表达式

流程控制:顺序、条件、循环三中结构,对于不同的语言会有不同的形式,case if when 模式匹配 ,迭代 递归 高阶函数——->整体抽象,可以用于实现上面三种结构

一些知识点

华氏温度(f)——摄氏温度(c)之间的转化公式

1
2
3
f = 32 + c* 9/5
**example:**
c = 40,f=32+72=104.

BIF

math

数学库
名字 函数
sqrt 开平方根

lists

名字 函数
map
filter
sum

linux-cmd

sort

参数 含义
-kx 按照第x列的大小进行排序
-n 按照数字比较,默认字典序排序

du

  • du -sh *
    统计当前文件夹下各个文件的大小
  • du -shm *
    统计当前文件夹下各个文件的大小,以M 为单位。-shkKB为单位

locate

linux 下可以使用 locate 和 find 来查找文件,但是 locate 在定位时要比 find 快.

locate 并不是穿梭于档案文件中查找,而是在数据库查找文件.find 正好相反,他的查找要穿梭于档案文件中.

locate [-ir] keyword
更新数据库
locate -u
updatedb

命令选项

参数 含义
i 不区分大小写
r 后面可以接收正则表达式

参考

问题总结 FAQ

  1. crontab不执行问题

    今天有个服务不能使用了,查来查去,原来 crontab 被干掉了。装上后还是无法运行,原来还要依赖 crond 这个服务

    • 检查文件具有可执行权限 chmod a+x
    • crond服务是否启动。查看及启动方式 service crond start service crond status

参考