WebM格式视频流播放可以通过HTML5在浏览器中实现,目前Chrome和FireFox都已经支持了该视频格式。WebM解码器在VP8引擎中实现,并且针对互联网特点做了很多优化。优点是在HTML5中实现,真正的实现了平台无关性,所有采用VP8引擎的浏览器都可以直接播放WebM格式的视频。当然很多浏览器并非VP8引擎的,而且没有哪个知名的流服务器支持WebM。这也是WebM的窘境。现在介绍一下大名鼎鼎的如何用FFmpeg作为WebM的流服务器。

0. FFserver

FFserver是一个流服务器,可以帮你将音视频内容转换成流在互联网上传输。它能够收集多个输入流,并转码->重铸->广播每一个流。如下图所示,

多个输入源被“喂”到广播服务器,这些多媒体内容就会分发到多个客户端。上图的目的是显示地表明你的流系统能够被分成多个块部署到网络上,允许你广播不同的在线内容,而不需要改变流媒体系统的结构。

FFserver有以下四个组成部分:输入源(Input sources)、供稿方(Feeds)、流组件(Streams)、媒体播放器(Media Player)。如下图所示

输入源(Input Source)

输入源并非是ffserver内部结构的一部分,通常倾向于使用外部应用发送音视频流到ffserver。由于FFmpeg大多用于输入源,本文以ffmpeg为例。首先输入源将连接到服务器并将自己绑定给一个供稿方。这里一个供稿方只能绑定一个源,因此只有供稿方未绑定时,才能接入输入源。一个输入源可以允许绑定到多个供稿方,但是只有输入源需要产生多个流媒体时,这样做才是有意义的。输入源提供相同的流媒体给不同的供稿方是无意义的,因为ffserver可以将供稿方提供给不同的流媒体。

供稿方(Feed)

供稿方是ffserver内部的一个组件,他的目的是将一个输入流绑定给一个或者多个输出流。将一个供稿方绑定给多个输出流是有意义的,因为你可能会需要这个输出流同时输出不同的多媒体格式。简单来说,每一个供稿方逻辑上代表了一个输入流。

流组件(Stream)

一个流组件是ffserver的一个内部组件,表示一个接入点,任何一个希望观看这个流的客户端都可以接入。举例来讲,对于同一个输入流,如果你希望输出一个高清视频和一个小尺寸的手机视频,你就可以将这个供稿方绑定到两个流组件上。供稿方和刘组件最大的区别是一个流组件可以与客户端建立多条连接,而一个供稿方通常只连接一个流组件。

播放器

播放器不是ffserver的组成部分,他只是代表了连接到流媒体服务器关心媒体内容的客户端。

1. 配置FFserver

当客户端机器实际的接入时,FFserver将成为一个守护进程。它需要足够的带宽向所有连接的客户端传输视频流。视频流编码通过FFmpeg实现,所以运行FFserver的主机并不需要很强的计算能力。

下面是FFserver.conf的一个例子,服务器定义了一个Feed和一个Stream。Feed作为流的输入源头,向Stream输出视频。Stream接收来自Feed的流,转码为WebM格式,根据定义的比特率和编解码器实现编码。客户端通过访问Stream就可以获得WebM的直播流。服务器的另一个组件是status.xml,用于观察各个流的状态。

Port 8090                      # Port to bind the server to
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 10000             # Maximum bandwidth per client# set this high enough to exceed stream bitrate
CustomLog -
NoDaemon                       # Remove this if you want FFserver to daemonize after start<Feed feed1.ffm>               # This is the input feed where FFmpeg will sendFile ./feed1.ffm            # video stream.FileMaxSize 64M              # Maximum file size for buffering videoACL allow 127.0.0.1         # Allowed IPs
</Feed><Stream test.webm>              # Output stream URL definitionFeed feed1.ffm              # Feed from which to receive videoFormat webm# Audio settingsAudioCodec vorbisAudioBitRate 64             # Audio bitrate# Video settingsVideoCodec libvpxVideoSize 720x576           # Video resolutionVideoFrameRate 25           # Video FPSAVOptionVideo flags +global_header  # Parameters passed to encoder# (same as ffmpeg command-line parameters)AVOptionVideo cpu-used 0AVOptionVideo qmin 10AVOptionVideo qmax 42AVOptionVideo quality goodAVOptionAudio flags +global_headerPreRoll 15StartSendOnKeyVideoBitRate 400            # Video bitrate
</Stream><Stream status.html>            # Server status URLFormat status# Only allow local people to get the statusACL allow localhostACL allow 192.168.0.0 192.168.255.255
</Stream><Redirect index.html>    # Just an URL redirect for index# Redirect index.html to the appropriate siteURL http://www.ffmpeg.org/
</Redirect>

ffserver启动时默认查看 /etc/ffserver.conf 配置文件,你可以通过-f选项控制查阅的配置文件。

ffserver -f ffserver.conf

运行结果如下图,这样ffserver就成功启动了。

打开http://localhost:8090/status.html可以看到当前server中各个流的状态。

2. 向FFserver接入视频流

FFserver启动之后,需要向http://localhost:8090/feed1.ffm接入视频流。注意,这里不需要指定编码格式,FFserver会重新编码。

视频流的来源可以是文件、摄像头或者录制屏幕。

1 比如从文件获得一个视频流并接入到FFM中。

 ffmpeg -i testvideo.mp4 http://localhost:8090/feed1.ffm

这样ffmpeg将从testvideo中获取视频,并发送到feed1.ffm中,然后Stream对feed1.ffm编码。如果希望ffmpeg以视频预设的帧率来feed数据,就需要用-re命令强制按照时间戳feed视频数据。如

ffmpeg -re -i testvideo.mp4 http://localhost:8090/feed1.ffm

运行结果如下:

ffmpeg version N-56125-gb4e1630-syslin Copyright (c) 2000-2013 the FFmpeg developersbuilt on Sep  9 2013 15:23:52 with gcc 4.4.7 (Ubuntu/Linaro 4.4.7-2ubuntu1)configuration: --prefix=/usr/local/ffmpeg --enable-shared --enable-nonfree --enable-gpl --enable-pthreads --disable-yasm --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-libvpx --enable-x11grab --extra-cflags=-I/usr/local/ffmpeg/include/ --extra-ldflags=-L/usr/local/ffmpeg/lib --enable-version3 --extra-version=syslinlibavutil      52. 43.100 / 52. 43.100libavcodec     55. 31.101 / 55. 31.101libavformat    55. 16.101 / 55. 16.101libavdevice    55.  3.100 / 55.  3.100libavfilter     3. 84.100 /  3. 84.100libswscale      2.  5.100 /  2.  5.100libswresample   0. 17.103 /  0. 17.103libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'testvideo.mp4':Metadata:major_brand     : isomminor_version   : 1compatible_brands: isomavc1creation_time   : 2013-07-14 17:16:27Duration: 00:03:14.75, start: 0.000000, bitrate: 392 kb/sStream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 255 kb/s, 20 fps, 20 tbr, 20k tbn, 40 tbc (default)Metadata:creation_time   : 2013-07-14 17:16:27handler_name    : mctemp69368b9542f0253c7.264#video:fps=20:par=1:1 - Imported with GPAC 0.5.0-rev4065Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 135 kb/s (default)Metadata:creation_time   : 2013-07-14 17:16:27handler_name    : GPAC ISO Audio Handler
[libvpx @ 0x9bd940] v1.1.0
Output #0, ffm, to 'http://localhost:8090/feed1.ffm':Metadata:major_brand     : isomminor_version   : 1compatible_brands: isomavc1creation_time   : nowencoder         : Lavf55.16.101Stream #0:0(und): Audio: vorbis (libvorbis), 22050 Hz, mono, fltp, 64 kb/s (default)Metadata:creation_time   : 2013-07-14 17:16:27handler_name    : GPAC ISO Audio HandlerStream #0:1(und): Video: vp8 (libvpx), yuv420p, 720x576 [SAR 16:15 DAR 4:3], q=10-42, 400 kb/s, 1000k tbn, 20 tbc (default)Metadata:creation_time   : 2013-07-14 17:16:27handler_name    : mctemp69368b9542f0253c7.264#video:fps=20:par=1:1 - Imported with GPAC 0.5.0-rev4065
Stream mapping:Stream #0:1 -> #0:0 (aac -> libvorbis)Stream #0:0 -> #0:1 (h264 -> libvpx)
Press [q] to stop, [?] for help
frame=   11 fps=1.9 q=0.0 size=       4kB time=00:00:00.41 bitrate=  78.9kbits/s
frame=   13 fps=2.0 q=0.0 size=       4kB time=00:00:00.41 bitrate=  78.9kbits/s
frame=   16 fps=2.2 q=0.0 size=       4kB time=00:00:00.41 bitrate=  78.9kbits/s
frame=   18 fps=2.2 q=0.0 size=       4kB time=00:00:00.41 bitrate=  78.9kbits/s
frame=   19 fps=2.1 q=0.0 size=       4kB time=00:00:00.43 bitrate=  74.8kbits/s
frame=   22 fps=2.3 q=0.0 size=       4kB time=00:00:00.90 bitrate=  36.3kbits/s
frame=   25 fps=2.4 q=0.0 size=      16kB time=00:00:00.90 bitrate= 145.2kbits/s
frame=   26 fps=2.2 q=0.0 size=      20kB time=00:00:00.90 bitrate= 181.5kbits/s
frame=   27 fps=2.2 q=0.0 size=      20kB time=00:00:00.90 bitrate= 181.5kbits/s
frame=   35 fps=2.7 q=0.0 size=      24kB time=00:00:01.39 bitrate= 141.4kbits/
......

2 录制屏幕并接入到FFM中

ffmpeg -f x11grab -r 25 -s 640x512 -i :0.0 -f alsa -i pulse http://localhost:8090/feed1.ffm

这里有两个-f,第一个指的是视频流,第二个指的是音频流。视频流是抓取屏幕形成视频,-r设置帧率为25帧/s,-s设置抓取图像大小为640x512,-i设置录制视频的初始坐标。音频流设置为alsa(Advanced Linux Sound Architecture),从Linux系统中获取音频。这其中这样ffmpeg可以录制屏幕feed到feed1.ffm中。运行结果如下:

ffmpeg version N-56125-gb4e1630-syslin Copyright (c) 2000-2013 the FFmpeg developersbuilt on Sep  9 2013 15:23:52 with gcc 4.4.7 (Ubuntu/Linaro 4.4.7-2ubuntu1)configuration: --prefix=/usr/local/ffmpeg --enable-shared --enable-nonfree --enable-gpl --enable-pthreads --disable-yasm --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-libvpx --enable-x11grab --extra-cflags=-I/usr/local/ffmpeg/include/ --extra-ldflags=-L/usr/local/ffmpeg/lib --enable-version3 --extra-version=syslinlibavutil      52. 43.100 / 52. 43.100libavcodec     55. 31.101 / 55. 31.101libavformat    55. 16.101 / 55. 16.101libavdevice    55.  3.100 / 55.  3.100libavfilter     3. 84.100 /  3. 84.100libswscale      2.  5.100 /  2.  5.100libswresample   0. 17.103 /  0. 17.103libpostproc    52.  3.100 / 52.  3.100
[x11grab @ 0x221d280] device: :0.0 -> display: :0.0 x: 0 y: 0 width: 640 height: 512
[x11grab @ 0x221d280] shared memory extension found
Input #0, x11grab, from ':0.0':Duration: N/A, start: 1378727353.224054, bitrate: 314258 kb/sStream #0:0: Video: rawvideo (BGR[0] / 0x524742), bgr0, 640x512, 314258 kb/s, 29.97 tbr, 1000k tbn, 29.97 tbc
Guessed Channel Layout for  Input Stream #1.0 : stereo
Input #1, alsa, from 'pulse':Duration: N/A, start: 1378727353.299919, bitrate: 1536 kb/sStream #1:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
[swscaler @ 0x21ff040] deprecated pixel format used, make sure you did set range correctly
[libvpx @ 0x225e100] v1.1.0
Output #0, ffm, to 'http://localhost:8090/feed1.ffm':Metadata:creation_time   : nowencoder         : Lavf55.16.101Stream #0:0: Audio: vorbis (libvorbis), 22050 Hz, mono, fltp, 64 kb/sStream #0:1: Video: vp8 (libvpx), yuv420p, 720x576, q=10-42, 400 kb/s, 1000k tbn, 29.97 tbc
Stream mapping:Stream #1:0 -> #0:0 (pcm_s16le -> libvorbis)Stream #0:0 -> #0:1 (rawvideo -> libvpx)
Press [q] to stop, [?] for help
frame=   22 fps=0.0 q=0.0 size=       4kB time=00:00:00.44 bitrate=  73.0kbits/s
frame=   37 fps= 36 q=0.0 size=     160kB time=00:00:00.92 bitrate=1411.3kbits/s
frame=   51 fps= 33 q=0.0 size=     220kB time=00:00:01.28 bitrate=1405.5kbits/s
frame=   66 fps= 32 q=0.0 size=     284kB time=00:00:01.40 bitrate=1660.1kbits/s
......

3 从摄像头获取视频发送到feed1.ffm中

ffmpeg -f video4linux2 -s 640x480 -r 25 -i /dev/video0 -f alsa -i pulse http://localhost:8090/feed1.ffm

video4linux2是负责从摄像头中获取视频的插件,/dev/video0就是摄像头映射的文件。运行结果如下

ffmpeg version N-56125-gb4e1630-syslin Copyright (c) 2000-2013 the FFmpeg developersbuilt on Sep  9 2013 15:23:52 with gcc 4.4.7 (Ubuntu/Linaro 4.4.7-2ubuntu1)configuration: --prefix=/usr/local/ffmpeg --enable-shared --enable-nonfree --enable-gpl --enable-pthreads --disable-yasm --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-libvpx --enable-x11grab --extra-cflags=-I/usr/local/ffmpeg/include/ --extra-ldflags=-L/usr/local/ffmpeg/lib --enable-version3 --extra-version=syslinlibavutil      52. 43.100 / 52. 43.100libavcodec     55. 31.101 / 55. 31.101libavformat    55. 16.101 / 55. 16.101libavdevice    55.  3.100 / 55.  3.100libavfilter     3. 84.100 /  3. 84.100libswscale      2.  5.100 /  2.  5.100libswresample   0. 17.103 /  0. 17.103libpostproc    52.  3.100 / 52.  3.100
[video4linux2,v4l2 @ 0xdc03c0] The V4L2 driver changed the video from 640x512 to 640x480
[video4linux2,v4l2 @ 0xdc03c0] The driver changed the time per frame from 1/25 to 1/30
Input #0, video4linux2,v4l2, from '/dev/video0':Duration: N/A, start: 415.173405, bitrate: 147456 kb/sStream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
Guessed Channel Layout for  Input Stream #1.0 : stereo
Input #1, alsa, from 'pulse':Duration: N/A, start: 1378794986.966378, bitrate: 1536 kb/sStream #1:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
[libvpx @ 0xde7f20] v1.1.0
Output #0, ffm, to 'http://172.26.176.6:8090/video.ffm':Metadata:creation_time   : nowencoder         : Lavf55.16.101Stream #0:0: Audio: vorbis (libvorbis), 22050 Hz, mono, fltp, 64 kb/sStream #0:1: Video: vp8 (libvpx), yuv420p, 720x576, q=10-42, 400 kb/s, 1000k tbn, 25 tbc
Stream mapping:Stream #1:0 -> #0:0 (pcm_s16le -> libvorbis)Stream #0:0 -> #0:1 (rawvideo -> libvpx)
Press [q] to stop, [?] for help
frame=   15 fps=0.0 q=0.0 size=       4kB time=00:00:00.42 bitrate=  77.5kbits/s
frame=   27 fps= 27 q=0.0 size=      16kB time=00:00:00.79 bitrate= 165.8kbits/s
frame=   40 fps= 27 q=0.0 size=      32kB time=00:00:01.27 bitrate= 205.4kbits/s
......

ffserver服务器实现WebM格式视频直播相关推荐

  1. srs服务器播放文件,使用SRS+ffmpeg搭建流媒体服务器播放m3u8格式视频

    1.简介 srs是一个简单的流媒体开源直播软件,ffmpeg是完整的跨平台解决方案,用于记录,转换和流传输音频和视频. 2.相关 官网下载页面:点击我到达 在线演示播放页面:点击我到达 Git页面:点 ...

  2. 借助MediaSource和SourceBuffer来实现webm格式视频的分片传输

    在CloudTV项目的初期曾实现了整段视频的对等传输和播放,但是当视频较大时会产生相当长时间的延迟(具体延迟时间由网络状况和视频文件大小决定):因此开始尝试视频的切片传输. 基于没有过多的音视频编码基 ...

  3. JavaCV音视频开发宝典:vb8和vp9编码的webm格式视频文件转成mp4文件

    <JavaCV音视频开发宝典>专栏目录导航 <JavaCV音视频开发宝典>专栏介绍和目录 ​ 前言 mp4不用多说,我们日常生活中,手机上或者浏览器网页中使用最多的视频文件就是 ...

  4. 酒店直播服务器系统,用ffmpeg+nginx服务器实现类似酒店视频直播系统

    最近EasyDarwin群里有朋友是做酒店视频直播系统的,大概需求是这样的:从网络电视平台那里购买了一个直播源,直播源是按并发数收费的,如果能够只用一路客户端将这个直播源获取到酒店的内网,然后再在酒店 ...

  5. webm格式视频怎么转换成mp4

    当我们接触的视频格式多了,对每种格式视频所具备的属性也就了解的清楚了.其实很多视频格式,如果我们想要做到随时随地的进行播放,并不是一个拿起来就能操作的事项.因为很多视频格式.因为自身的兼容性,以及格式 ...

  6. [标题党]15分钟开发可支持百万观众的H5视频直播网站

    15分钟用Rails开发一个Blog有什么意思?那是2005年的Hipster追捧的玩具. 现在都已经是2015年了.HTML应该读作Hipster's Toolkit Made Live了. 既然是 ...

  7. Ubuntu系统录屏webm格式mp4格式方法

    录屏快捷键:ctrl+alt+shift+r 默认录屏时长 30 秒 录屏结果是 .webm 格式视频 可以采用 ffmpeg 方法转换成 .mp4 格式 要安装 ffmpeg,请在终端中键入以下行: ...

  8. 视频直播网站开发的最佳实践

    随着互联网技术的不断发展,视频直播成为了网络世界中的一股热潮.无论是企业还是个人,都可以通过搭建自己的视频直播网站来实现自己的目标.但是,对于很多企业来说,视频直播网站的开发是一项复杂的任务.因此,本 ...

  9. webm格式怎么转换成mp4?四招快速转换!

    众所周知,视频是我们生活工作中的重要内容,也是传播信息.促进交流的关键工具.随着各类短视频平台的兴起和发展,视频技术也在不断创新.目前,视频格式相对较多,而一些社交网站.短视频软件对视频格式有一定的限 ...

最新文章

  1. 精讲 MySQL 事务日志:redo log 和 undo log
  2. python爬虫原理-Python爬虫原理
  3. 【NLP】simhash判断文档相似度
  4. 三种方式实现分布式锁
  5. python成绩转换、百分制到五分制_设计一个程序,将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出。90分以上为A,80~90分为B,...
  6. javascript复制到黏贴板之完美兼容
  7. python collections 模块中的 deque
  8. String s = new String(xyz);创建了几个对象?
  9. java为什么要分为service层,dao层,controller层
  10. 用Python实现ax²+by的图灵机【形式语言与自动机】
  11. 几个清华和交大学霸的公众号,值得学习
  12. 51单片机入门——LCD1602
  13. uniapp获取当前城市编号和信息
  14. dwg如何转换成pdf?
  15. 数据分析 之 归因分析,多因素影响下如何归因?
  16. [NPUCTF2020]碰上彩虹,吃定彩虹
  17. 论机器学习中数据的重要性
  18. Android聊天软件的开发(七)--聊天通信
  19. cordova跳转远程页面调用浏览器问题
  20. 设置ubuntu系统中vi的默认模板文件

热门文章

  1. C语言 将一个数组的内容复制到另一个数组
  2. linux调用windows接口,想要打通Windows和Linux的任督二脉,少不了API这层功力
  3. 【工控老马】欧姆龙PLC Socket发送Fins/TCP命令解析
  4. 博学谷前端 CSS字体样式属性
  5. 软件工程文档编写标准包括哪些内容
  6. bat批处理命令基础知识
  7. 拼多多根据ID取商品详情 API
  8. R安装包失败解决办法
  9. 数据生成器 -支持多种类型
  10. 成都理工大学计算机组成原理考试,计算机组成原理试题-20210320185321.doc-原创力文档...