在centos裡為nginx安裝rtmp模組

必備模組

  • openssl
  • zlib
  • pcre

安裝步驟

參考資料

docker pull時的錯誤:failed to register layer

錯誤訊息

有時在下docker pull時會出現如下的錯誤:

解決方案

這是因為有時docker弄亂了其工作空間,可能就是原因。您可以嘗試以下方法:

  • 停止所有(java)容器,刪除它們,刪除Java映像(或所有映像),然後重新拉動並運行。
  • 如果這沒有幫助,則也重新啟動Docker引擎。
  • 如果仍然不能解決問題,請停止docker引擎,刪除docker工作目錄,然後重新啟動docker引擎。

以我的經驗,這可以解決所有類似OP的問題。

相關討論串: Docker error when pulling Java 8 image – “failed to register layer”

docker初探

  1. 安裝docker(於centos7)
  1. 測試用指令
  • 顯示 docker 的資訊
    $ docker info

  • 顯示 docker 的版本
    $ docker version

  • 取得一個指定版本的 image

  • 如果不指定 image 版本該版本則為 latest
    $ docker pull [Image 名稱]:[Image 版本]

  • ex:
    $ docker pull hello-world
    $ docker pull ubuntu
    $ docker pull ubuntu:14.04

  • 顯示 docker 的 images 清單
    $ docker images

  • 透過 iamge 執行並產生一個新的 container
    $ docker run [Image 名稱]:[Image 版本] [執行指令]

  • ex:
    $ docker run hello-world
    $ docker run ubuntu /bin/echo “example 1 – ubuntu”
    $ docker run ubuntu:14.04 /bin/echo “example 2 – ubuntu:14.04”

*********** 我是分隔線 ***********

  • [OPTIONS]:
  • -i, –interactive (互動模式)
  • -t, –tty (配置一個終端機)
  • -d, –detach (在背景執行)

$ docker run [OPTIONS] [Image 名稱]:[Image 版本] [執行指令]

  • ex:
    $ docker run -i -t ubuntu:14.04 bash
    $ exit

  • 查看正在執行的 containers
    $ docker ps

  • 查看所有的 containers
    $ docker ps -a

  • 對正在執行的 container 下執指令

  • [OPTIONS]:

  • -i, –interactive (互動模式)

  • -t, –tty (配置一個終端機)

  • docker exec [OPTIONS] [Container ID] [執行指令]

  • ex:

  • 產生一個 container 在背景執行
    $ docker run -i -t -d ubuntu:14.04 bash

  • 查詢正在執行的 container
    $ docker ps
    $ docker exec -i -t [Container ID] bash
    $ exit

  • 總結

  • 啟動 docker container
    $ docker start [Container ID]

  • 停止 docker container
    $ docker stop [Container ID]

  • 重新啟動 docker container
    $ docker restart [Container ID]

  • ex:

  • 產生一個 container 在背景執行
    $ docker run -i -t -d ubuntu bash

$ docker ps
$ docker stop [Container ID]

$ docker ps
$ docker start [Container ID]

$ docker ps
$ docker restart [Container ID]

  • 刪除 container
    $ docker rm [Container ID]

  • ex:
    $ docker ps
    $ docker stop [Container ID]

$ docker rm [Container ID]
$ docker ps -a

  • 刪除 image

  • 刪除 image 前必需將透過該 image 所產生的 container 移除
    $ docker rmi [Image ID]

  • ex:

  • 移除 hello-world image 所產生的 container
    $ docker ps -a
    $ docker rm [Container ID]
    $ docker ps -a

  • 移除 hello-world image
    $ docker images
    $ docker rmi [Image ID]
    $ docker images


** 小技巧 **************************


  • 停止所有的 containers
    $ docker stop $(docker ps -a -q)

  • 刪除所有的 containers
    $ docker rm $(docker ps -a -q)

  • 刪除所有的 images
    $ docker rmi $(docker images -a -q)

  • 運行容器並掛載主機捲
    Docker容器不會保存它們產生的數據。該過程完成後,容器將停止運行,並且容器中的所有物品都將被移走。

如果要在容器停止後仍要存儲持久性數據,則需要啟用共享存儲卷。

對於安裝卷,請使用-v屬性以及要在其中保存數據的目錄的指定位置,然後是該數據在容器內的位置。

-v [/host/volume/location]:[/container/storage]
整個docker container run命令是:

docker container run -v [/host/volume/location]:[/container/storage] [docker_image]

docker build -t fmsdocker . –no-cache

  • docker file 寫法 / run寫法
    https://docs.docker.com/engine/reference/run/

  • entrypoint
    docker run –entrypoint=/bin/hostname test

  • ENV
    ENV HOSTNAME testhost
    export today=Wednesday
    docker run -e “deep=purple” -e today –rm alpine env

  • HEALTHCHECK
    docker run –name=test -d
    –health-cmd=‘stat /etc/passwd || exit 1’
    –health-interval=2s
    busybox sleep 1d

HEALTHCHECK –interval=5s –timeout=3s
CMD curl ${HOSTNAME}:1111/admin/getServerStats?auser=admin&apswd=pass.123 || exit 1

直播相關教學文章庫

  • 直播點播錄播
  • 直播原理介紹
  • 視訊編解碼
  • 推流介紹
  • 串流格式介紹
  • 播放器介紹

*直播軟體比較

  • 直播品質關鍵
  • SRS-Bench: 搭建直播服务器以后需要对直播性能进行测试,srs-bench 针对特定业务性能测试并发推流来解决

編碼與封裝

前言

要說到影片的編碼與封裝,就要先聊聊影片是怎麼產生的。相信大家小時後都有看過翻頁動畫吧,就是由很多張圖片組成的書,在快速翻書時就可以看到一幅連續的動畫,如下圖:
翻頁動畫
影片的原理也是如此,一張張的照片,經過快速的連續切換,就成為了動態影片。但是這樣子的原始影片大小非常的可觀,若影像的每個畫素的三個顏色RGB各需要一個位元組儲存,每一個畫素需要3位元組,解析度1280×720的影像的大小為2.76M位元組,若每秒FPS為25偵,所需的位元率會達到553Mb/s。這種大小不論是儲存或用網路傳輸都是有困難的,因此編碼壓縮勢在必行。

資料壓縮的難題

音檔和視訊有著完全不同的編碼方式和壓縮理論,音訊編碼的難點在於延時敏感、卡頓敏感、噪聲抑制(Denoise)、回聲消除(AEC)、靜音檢測(VAD)、混音演算法等…每個項目都有各別的演算法去深究如何優化音訊的擷取。

而視訊壓縮編碼的難點則在於編碼效率和編碼複雜度的平衡。例如H.265較H.264在相同的位元率之下有更好的畫質呈現、更小的檔案大小,但相較起來,編碼的複雜度約增加了近十倍。但在實際的應用當中,大多數狀況的編碼端及解碼端的電腦資源不固定,因此在編碼複雜度和編碼效率中取得平衡則是很重要的事。

H264和H265的比較圖
264vs265
來源: H.264和H.265(HEVC)深度解析及對比

影片壓縮衡量單位

位元速率

網路影音多媒體包括音視頻在單位時間內的資料傳輸率時通常使用碼流位元速率來表示,代表每秒傳輸或處理的位元量(資料流量),單位 Mbps (Mb/s) 。
亦可說是所需的最低下載速度,下載速度越低,需越高的壓縮,尤其是破壞性壓縮,故位元速率會影響到影片品質。

  • 相同解析度下,位元率越高,每秒包含的資訊越多,檔案越大、壓縮比越小,影音品質越佳,越吃頻寬及電腦的運算能力,配備不夠好者可能會很卡。
  • 使用較低的位元速率輸出,在靜止畫面差異較小,動態畫面容易產生色塊,畫質低落,整體較不清晰。

我們可以從位元速率去推算最終整個串流檔案的大小,完整的影片則包括『視頻』及『音頻』兩個軌道,其公式如下:

檔案大小(MB為單位) = (音訊編位元速率(KBit為單位)/8 + 視訊編位元速率(KBit為單位)/8)× 影片總長度(秒為單位

而音檔的位元速率公式如下:

位元速率(Bit Per Second) = 取樣率(Hz) x 採用位數 x 聲道數

通常,影片位元速率會受到FPS(每秒幀數)、解析度(指輸出的影像尺寸)、編碼方式(有VBR、CBR、ABR三種)、壓縮演算法(如:H.264、H.265和VP9)影響,音檔則受到取樣率、採用位數(指單次取樣儲存時所占大小,例如電話就是3kHZ取樣的7位聲音,而CD是44.1kHZ取樣的16位聲音)以及聲道數影響,以上幾項的選擇目標是達到位元速率的最小化播放畫質最佳化之間的理想的平衡。

下面針對上面提到的幾個名詞做解釋:

FPS

FPS是Frames Per Second的縮寫,是指每秒鐘重新整理的圖片的幀數,也可以理解為圖形處理器每秒鐘能夠重新整理幾次。越高的幀速率可以得到更流暢、更逼真的動畫。每秒鐘幀數(FPS)越多,所顯示的動作就會越流暢。

解析度

編碼方式

壓縮演算法

影像壓縮原理

資料壓縮是透過去除資料中的冗餘資訊而達成。就視訊資料而言,資料中的冗餘資訊可以分成四類:

  1. 時間上的冗餘資訊(temporal redundancy)
    在視訊資料中,相鄰的影格(frame)與影格之間通常有很強的關連性,這樣的關連性即為時間上的冗餘資訊。

  2. 空間上的冗餘資訊(spatial redundancy)
    在同一張影格之中,相鄰的像素之間通常有很強的關連性,這樣的關連性即為空間上的冗餘資訊。

  3. 統計上的冗餘資訊(statistical redundancy)
    統計上的冗餘資訊指的是欲編碼的符號(symbol)的機率分布是不均勻(non-uniform)的。

  4. 感知上的冗餘資訊(perceptual redundancy)
    感知上的冗餘資訊是指在人在觀看視訊時,人眼無法察覺的資訊。