松鼠Mike的树洞 -- Make Each Day Count
  • 排序
  • 选择时间

利用ffmpeg+crtmpserver构建流媒体服务器

发布日期: 2015-08-27更新日期:2015-08-28

一年多以前拿Nginx和Nginx的RTMP模块搭建过一个RTMP服务器。然而一年中沧海桑田,发生了很多事情...好吧,其实是后来因为嫌自己以前自己写的网站界面太丑了,毕竟美化前端是一件相当花心思的事情,而我又是一个懒人...所有后来换用了WordPress,所以就把服务器给格了。

但是随着插件越装越多,网站的访问速度越来越慢。一开始还可以忍受,但是越到后来看着那个圈圈转的时间越来越长就越来越心焦。还有一个原因是我想根据自己的需要实现一些功能,不自己写插件的话效果不好,写插件的话又要花更多的心思和精力。所以我决定让WordPress也成为历史,然后重新回到自己创造的路线上来。在待机了将近一年以后花了一个礼拜把网站的框架基本搭好,美工嘛凑或了,能看就好...

这次重新搭建RTMP服务器的时候考虑了好几个RTMP Server软件,其实主要就是Nginx,ffserver和c++ rtmp server(crtmpserver)。考虑到Nginx是可以替代Apache的优秀的服务器软件,而我已经用Apache搭好了网站,所以我对这两个软件共存在同一台电脑上感觉很不舒服,所以这次首先把Nginx放在了waitinglist上。因为编译安装了ffmpeg,考虑到尽量少的安装程序,ffserver成了这次第一个尝试的RTMP软件。但是花了一整天实践下来发现要想用ffserver实现功能好像还要再花更多的时间,所以今天晚上果断尝试crtmpserver。经过个把小时后成功在网页上看到了rtmp的视频流。下面把过程记录下来备忘。

首先介绍一下crtmpserver是个什么。crtmpserver的全程是C++ RTMP Server,官方主页是http://www.rtmpd.com/。crtmpserver官方的定义如下: crtmpserver it is a high performance streaming server able to stream (live or recorded) in the following technologies:

  1. To and from Flash (RTMP,RTMPE, RTMPS, RTMPT, RTMPTE)
  2. To and from embedded devices: Android, IP cameras, Hardware encoders
  3. From iOS devices
  4. IP-TV using MPEG-TS and RTSP/RTCP/RTP protocols
Also, crtmpserver can be used as a high performance rendes-vous server. For example, it enables you to do:
  • Audio/Video conferencing
  • Online gaming
  • Online collaboration
  • Simple/complex chat applications
Ubuntu版本的服务器的话可以免去编译源码的麻烦,直接从主页上下载下来已经编译好的可执行文件(虽然编译一下也不怎么麻烦)。可执行文件下载下来以后tar xzvj解压缩到任意目录然后执行
./run_flvplayback.sh
就可以直接运行程序。默认的配置文件可以不需要修改。命令执行后如果看到了屏幕上显示Go!Go!Go!就表示你可以开始往crtmpserver里推送视频音频流了。

我使用ffmpeg来边转码边推送流,执行的命令如下:

# Play a local video file
ffmpeg -re -i /path/video.mp4 -acodec copy -vcodec copy -f flv rtmp://localhost/live/live
# Stream video & Audio from camera and microphone
ffmpeg -r 25 -s 720x546 -f v4l2 -i /dev/video0 -f alsa -ac 2 -ar 44100 -i hw:0 -f flv rtmp://localhost/live/live

网页播放器采用了jw Player,非商业用途的话简单注册一下就可以下载下来。jwplayer的file选项写成

file: "rtmp://www.domain.com/flvplayback/test"
就可以实现流的播放。