日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

FFserver服务器实现WebM格式视频直播

發(fā)布時(shí)間:2023/12/31 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 FFserver服务器实现WebM格式视频直播 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

WebM格式視頻流播放可以通過HTML5在瀏覽器中實(shí)現(xiàn),目前Chrome和FireFox都已經(jīng)支持了該視頻格式。WebM解碼器在VP8引擎中實(shí)現(xiàn),并且針對互聯(lián)網(wǎng)特點(diǎn)做了很多優(yōu)化。優(yōu)點(diǎn)是在HTML5中實(shí)現(xiàn),真正的實(shí)現(xiàn)了平臺無關(guān)性,所有采用VP8引擎的瀏覽器都可以直接播放WebM格式的視頻。當(dāng)然很多瀏覽器并非VP8引擎的,而且沒有哪個(gè)知名的流服務(wù)器支持WebM。這也是WebM的窘境。現(xiàn)在介紹一下大名鼎鼎的如何用FFmpeg作為WebM的流服務(wù)器。

0. FFserver

FFserver是一個(gè)流服務(wù)器,可以幫你將音視頻內(nèi)容轉(zhuǎn)換成流在互聯(lián)網(wǎng)上傳輸。它能夠收集多個(gè)輸入流,并轉(zhuǎn)碼->重鑄->廣播每一個(gè)流。如下圖所示,

多個(gè)輸入源被“喂”到廣播服務(wù)器,這些多媒體內(nèi)容就會分發(fā)到多個(gè)客戶端。上圖的目的是顯示地表明你的流系統(tǒng)能夠被分成多個(gè)塊部署到網(wǎng)絡(luò)上,允許你廣播不同的在線內(nèi)容,而不需要改變流媒體系統(tǒng)的結(jié)構(gòu)。

FFserver有以下四個(gè)組成部分:輸入源(Input sources)、供稿方(Feeds)、流組件(Streams)、媒體播放器(Media Player)。如下圖所示

輸入源(Input Source)

輸入源并非是ffserver內(nèi)部結(jié)構(gòu)的一部分,通常傾向于使用外部應(yīng)用發(fā)送音視頻流到ffserver。由于FFmpeg大多用于輸入源,本文以ffmpeg為例。首先輸入源將連接到服務(wù)器并將自己綁定給一個(gè)供稿方。這里一個(gè)供稿方只能綁定一個(gè)源,因此只有供稿方未綁定時(shí),才能接入輸入源。一個(gè)輸入源可以允許綁定到多個(gè)供稿方,但是只有輸入源需要產(chǎn)生多個(gè)流媒體時(shí),這樣做才是有意義的。輸入源提供相同的流媒體給不同的供稿方是無意義的,因?yàn)閒fserver可以將供稿方提供給不同的流媒體。

供稿方(Feed)

供稿方是ffserver內(nèi)部的一個(gè)組件,他的目的是將一個(gè)輸入流綁定給一個(gè)或者多個(gè)輸出流。將一個(gè)供稿方綁定給多個(gè)輸出流是有意義的,因?yàn)槟憧赡軙枰@個(gè)輸出流同時(shí)輸出不同的多媒體格式。簡單來說,每一個(gè)供稿方邏輯上代表了一個(gè)輸入流。

流組件(Stream)

一個(gè)流組件是ffserver的一個(gè)內(nèi)部組件,表示一個(gè)接入點(diǎn),任何一個(gè)希望觀看這個(gè)流的客戶端都可以接入。舉例來講,對于同一個(gè)輸入流,如果你希望輸出一個(gè)高清視頻和一個(gè)小尺寸的手機(jī)視頻,你就可以將這個(gè)供稿方綁定到兩個(gè)流組件上。供稿方和劉組件最大的區(qū)別是一個(gè)流組件可以與客戶端建立多條連接,而一個(gè)供稿方通常只連接一個(gè)流組件。

播放器

播放器不是ffserver的組成部分,他只是代表了連接到流媒體服務(wù)器關(guān)心媒體內(nèi)容的客戶端。

1. 配置FFserver

當(dāng)客戶端機(jī)器實(shí)際的接入時(shí),F(xiàn)Fserver將成為一個(gè)守護(hù)進(jìn)程。它需要足夠的帶寬向所有連接的客戶端傳輸視頻流。視頻流編碼通過FFmpeg實(shí)現(xiàn),所以運(yùn)行FFserver的主機(jī)并不需要很強(qiáng)的計(jì)算能力。

下面是FFserver.conf的一個(gè)例子,服務(wù)器定義了一個(gè)Feed和一個(gè)Stream。Feed作為流的輸入源頭,向Stream輸出視頻。Stream接收來自Feed的流,轉(zhuǎn)碼為WebM格式,根據(jù)定義的比特率和編解碼器實(shí)現(xiàn)編碼。客戶端通過訪問Stream就可以獲得WebM的直播流。服務(wù)器的另一個(gè)組件是status.xml,用于觀察各個(gè)流的狀態(tài)。

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 send
   File ./feed1.ffm            # video stream.
   FileMaxSize 64M              # Maximum file size for buffering video
   ACL allow 127.0.0.1         # Allowed IPs
</Feed>

<Stream test.webm>              # Output stream URL definition
   Feed feed1.ffm              # Feed from which to receive video
   Format webm

   # Audio settings
   AudioCodec vorbis
   AudioBitRate 64             # Audio bitrate

   # Video settings
   VideoCodec libvpx
   VideoSize 720x576           # Video resolution
   VideoFrameRate 25           # Video FPS
   AVOptionVideo flags +global_header  # Parameters passed to encoder
                                       # (same as ffmpeg command-line parameters)
   AVOptionVideo cpu-used 0
   AVOptionVideo qmin 10
   AVOptionVideo qmax 42
   AVOptionVideo quality good
   AVOptionAudio flags +global_header
   PreRoll 15
   StartSendOnKey
   VideoBitRate 400            # Video bitrate
</Stream>

<Stream status.html>            # Server status URL
   Format status
   # Only allow local people to get the status
   ACL allow localhost
   ACL 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 site
   URL http://www.ffmpeg.org/
</Redirect>

ffserver啟動(dòng)時(shí)默認(rèn)查看/etc/ffserver.conf 配置文件,你可以通過-f選項(xiàng)控制查閱的配置文件。

ffserver -f ffserver.conf

運(yùn)行結(jié)果如下圖,這樣ffserver就成功啟動(dòng)了。

打開http://localhost:8090/status.html可以看到當(dāng)前server中各個(gè)流的狀態(tài)。

2. 向FFserver接入視頻流

FFserver啟動(dòng)之后,需要向http://localhost:8090/feed1.ffm接入視頻流。注意,這里不需要指定編碼格式,F(xiàn)Fserver會重新編碼。

視頻流的來源可以是文件、攝像頭或者錄制屏幕。

1 比如從文件獲得一個(gè)視頻流并接入到FFM中。

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

這樣ffmpeg將從testvideo中獲取視頻,并發(fā)送到feed1.ffm中,然后Stream對feed1.ffm編碼。如果希望ffmpeg以視頻預(yù)設(shè)的幀率來feed數(shù)據(jù),就需要用-re命令強(qiáng)制按照時(shí)間戳feed視頻數(shù)據(jù)。如

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

運(yùn)行結(jié)果如下:

ffmpeg version N-56125-gb4e1630-syslin Copyright (c) 2000-2013 the FFmpeg developers
  built 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=syslin
  libavutil      52. 43.100 / 52. 43.100
  libavcodec     55. 31.101 / 55. 31.101
  libavformat    55. 16.101 / 55. 16.101
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 84.100 /  3. 84.100
  libswscale      2.  5.100 /  2.  5.100
  libswresample   0. 17.103 /  0. 17.103
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'testvideo.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    creation_time   : 2013-07-14 17:16:27
  Duration: 00:03:14.75, start: 0.000000, bitrate: 392 kb/s
    Stream #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:27
      handler_name    : mctemp69368b9542f0253c7.264#video:fps=20:par=1:1 - Imported with GPAC 0.5.0-rev4065
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 135 kb/s (default)
    Metadata:
      creation_time   : 2013-07-14 17:16:27
      handler_name    : GPAC ISO Audio Handler
[libvpx @ 0x9bd940] v1.1.0
Output #0, ffm, to 'http://localhost:8090/feed1.ffm':
  Metadata:
    major_brand     : isom
    minor_version   : 1
    compatible_brands: isomavc1
    creation_time   : now
    encoder         : Lavf55.16.101
    Stream #0:0(und): Audio: vorbis (libvorbis), 22050 Hz, mono, fltp, 64 kb/s (default)
    Metadata:
      creation_time   : 2013-07-14 17:16:27
      handler_name    : GPAC ISO Audio Handler
    Stream #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:27
      handler_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/
......

View Code

2 錄制屏幕并接入到FFM中

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

這里有兩個(gè)-f,第一個(gè)指的是視頻流,第二個(gè)指的是音頻流。視頻流是抓取屏幕形成視頻,-r設(shè)置幀率為25幀/s,-s設(shè)置抓取圖像大小為640x512,-i設(shè)置錄制視頻的初始坐標(biāo)。音頻流設(shè)置為alsa(Advanced Linux Sound Architecture),從Linux系統(tǒng)中獲取音頻。這其中這樣ffmpeg可以錄制屏幕feed到feed1.ffm中。運(yùn)行結(jié)果如下:

ffmpeg version N-56125-gb4e1630-syslin Copyright (c) 2000-2013 the FFmpeg developers
  built 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=syslin
  libavutil      52. 43.100 / 52. 43.100
  libavcodec     55. 31.101 / 55. 31.101
  libavformat    55. 16.101 / 55. 16.101
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 84.100 /  3. 84.100
  libswscale      2.  5.100 /  2.  5.100
  libswresample   0. 17.103 /  0. 17.103
  libpostproc    52.  3.100 / 52.  3.100
[x11grab @ 0x221d280] device: :0.0 -> display: :0.0 x: 0 y: 0  640 height: 512
[x11grab @ 0x221d280] shared memory extension found
Input #0, x11grab, from ':0.0':
  Duration: N/A, start: 1378727353.224054, bitrate: 314258 kb/s
    Stream #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/s
    Stream #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   : now
    encoder         : Lavf55.16.101
    Stream #0:0: Audio: vorbis (libvorbis), 22050 Hz, mono, fltp, 64 kb/s
    Stream #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
......

View Code

3 從攝像頭獲取視頻發(fā)送到feed1.ffm中

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

video4linux2是負(fù)責(zé)從攝像頭中獲取視頻的插件,/dev/video0就是攝像頭映射的文件。運(yùn)行結(jié)果如下

ffmpeg version N-56125-gb4e1630-syslin Copyright (c) 2000-2013 the FFmpeg developers
  built 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=syslin
  libavutil      52. 43.100 / 52. 43.100
  libavcodec     55. 31.101 / 55. 31.101
  libavformat    55. 16.101 / 55. 16.101
  libavdevice    55.  3.100 / 55.  3.100
  libavfilter     3. 84.100 /  3. 84.100
  libswscale      2.  5.100 /  2.  5.100
  libswresample   0. 17.103 /  0. 17.103
  libpostproc    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/s
    Stream #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/s
    Stream #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   : now
    encoder         : Lavf55.16.101
    Stream #0:0: Audio: vorbis (libvorbis), 22050 Hz, mono, fltp, 64 kb/s
    Stream #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
......

View Code

參考:

https://www.virag.si/2012/11/streaming-live-webm-video-with-ffmpeg/

http://trac.ffmpeg.org/wiki/Streaming%20media%20with%20ffserver

總結(jié)

以上是生活随笔為你收集整理的FFserver服务器实现WebM格式视频直播的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。