Linux直播推流

Linux系統實現youtube推流直播git

系統:centos-7-x64 (32位系統選擇不一樣源下載安裝,下載網址見最後)shell

軟件:FFMPEG, youtube-dlcentos

1. 安裝FFMPEG服務器

建立並cd到一個目錄,下載最新的FFMPEG(下面是64位,32位需分別下載 https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-i686-static.tar.xz https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-i686-static.tar.xz.md5)less

$ cd /home/john網站

$ wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xzui

$ wget https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-amd64-static.tar.xz.md5編碼

 

下載完成後,能夠檢查完整性spa

$ md5sum -c ffmpeg-git-amd64-static.tar.xz.md5
ffmpeg-git-amd64-static.tar.xz: OK.net

 

解壓(有可能須要解壓兩次,我解壓一次就能夠了),若是遇到「tar (child): xz: Cannot exec: No such file or directory」,需安裝xz,命令「yum -y xz」

$ tar xvf ffmpeg-git-amd64-static.tar.xz

 

如今獲得目錄」ffmpeg-git-20180203-amd64-static「(日期爲最新版本日期,使用命令ls -a「查看當前目錄全部目錄文件)

$ ls ffmpeg-git-20180203-amd64-static
ffmpeg ffprobe GPLv3.txt manpages model qt-faststart readme.txt

 

閱讀readme.txt(hit "q" to exit out of "less")

$ less ffmpeg-git-20180203-amd64-static/readme.txt

 

使用相對路徑

$ pwd
/home/john

$ ./ffmpeg-git-20180203-amd64-static/ffmpeg
ffmpeg version N-89948-ge3d946b3f4-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 6.4.0 (Debian 6.4.0-11) 20171206
(snipped output to save space)

 

或者使用絕對路徑

$ pwd
/home/john

$ /home/john/ffmpeg-git-20180203-amd64-static/ffmpeg
ffmpeg version N-89948-ge3d946b3f4-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 6.4.0 (Debian 6.4.0-11) 20171206
(snipped output to save space)

 

要全局安裝它,我須要將二進制文件移動到shell的路徑中。「PATH」是環境中的一個變量,它被設置爲shell用來定位二進制文件的冒號分隔目錄列表。這是個人系統路徑。

$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/john/.local/bin:/home/john/bin

 

檢查是否安裝舊版本

$ whereis ffmpeg
ffmpeg: /usr/bin/ffmpeg

 

這列出了安裝在/usr/bin中的較老版本的ffmpeg。我能夠卸載舊版本,或者將新的ffmpeg二進制文件放在/usr/bin以前搜索的路徑中。應該是/usr/local/bin

 

將二進制文件ffmpeg和ffprobe移動到shell的路徑中(sudo自行搜索安裝,也能夠直接mv,但比較麻煩)

$ sudo mv ffmpeg-git-20180203-amd64-static/ffmpeg ffmpeg-git-20180203-amd64-static/ffprobe /usr/local/bin/

$ whereis ffmpeg
ffmpeg: /usr/local/bin/ffmpeg

$ whereis ffprobe
ffprobe: /usr/local/bin/ffprobe

 

安裝完成了

$ ffmpeg
ffmpeg version N-89948-ge3d946b3f4-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 6.4.0 (Debian 6.4.0-11) 20171206
(snipped output to save space)

 

卸載(固然安裝是用不到的)

$ sudo rm /usr/local/bin/ffmpeg /usr/local/bin/ffprobe

 

2.安裝youtube-dl

$ pip install youtube-dl

 

3.推流

$ youtube-dl -f best $URL -o - | ffmpeg -re -i pipe:0 -c:v copy -c:a aac -f flv $RTMP

$RTMP爲rtmp地址+直播碼,須要加引號""

可是斷開鏈接後推流會中止,在命令最後加 & 保持後臺運行

備註:

1)使用youtube-dl下載視頻的命令:youtube-dl -f best jNQXAC9IVRw

  這個命令使用 -f best 參數尋找最佳畫質,jNQXAC9IVRw 做爲視頻的番號告訴 youtube-dl 你想要下載哪一個視頻。

2)使用streamlink 播放視頻的命令:streamlink $URL best

  這個命令中 best 參數告訴了你想尋找最佳畫質的資源, $URL 做爲視頻的播放地址告訴 streamlink 你想要播放哪一個網頁上的視頻。若是你的電腦上安裝了ffplay、ffmpeg等軟件,還可使用 --player=ffplay 指定你要使用哪一個播放器播放,這裏就用 ffplay 播放器。

3)使用ffmpeg推流的命令:cat example.mp4 | ffmpeg -re -i pipe:0 -c:v copy -c:a aac -f flv $RTMP

  這個命令將告訴 cat 程序從你想要播放的視頻文件中讀取數據,| 符號表示建立一個從 cat 程序到 ffmpeg 程序的數據管道,將視頻源源不斷地傳輸過去。以後的參數中,-i pipe:0 參數告訴 ffmpeg 要從數據管道中讀取數據。

  -re 參數:表示告訴 ffmpeg 要按照視頻正常播放的幀數來處理。

  -i 參數:表示告訴 ffmpeg 要從什麼地方讀取媒體流數據。這裏,pipe:0 是從管道讀取數據,pipe:1 是向管道寫入數據。

  -c 參數:告訴 ffmpeg 編碼方案。這裏的 -c copy 表示徹底拷貝,若是使用 -c:v copy -c:a aac ,則表示只拷貝視頻,而音頻使用 aac 格式從新編碼。

  -f 參數:表示文件的輸入輸出位置。這裏的 -f flv 表示輸出爲 flv 格式,$RTMP 表示推流到BILIBILI直播網站的地址,這裏就替換成完整的直播間 RTMP 推流地址。

 

舉例:

1)從 Youtube 轉播到 BILIBILI:youtube-dl -f best $URL -o - | ffmpeg -re -i pipe:0 -c:v copy -c:a aac -f flv $RTMP

  這是一個簡單的轉播案例,使用UNIX的通訊管道,簡單地將 youtube-dl 下載的媒體流轉發給 ffmpeg,此時 ffmpeg 只作簡單的音頻轉碼和格式處理就把媒體流發送到BILIBILI直播間的RTMP推流地址上。因爲行爲十分簡單,計算機資源佔用極少。

2)從 Ustream 轉播到 BILIBILI:streamlink $URL best -O | ffmpeg -re -i pipe:0 -c copy -f flv $RTMP

  這是一個簡單的轉播案例,使用UNIX的通訊管道,簡單地將 streamlink 下載的媒體流轉發給 ffmpeg,此時 ffmpeg 只作簡單的鏡像拷貝就把媒體流發送到BILIBILI直播間的RTMP推流地址上。一樣因爲行爲十分簡單,計算機資源佔用極少。

3)從 Youtube 轉播到任意RTMP服務器:youtube-dl -f best $URL -o - | ffmpeg -re -i pipe:0 -c:v copy -c:a aac -f flv $RTMP

  這個例子和前面兩個別無二致,只須要替換 $RTMP 地址便可。

 


參考:

https://www.bilibili.com/read/cv2184009

https://www.johnvansickle.com/ffmpeg/faq/

https://www.johnvansickle.com/ffmpeg/

https://blog.csdn.net/heng4719/article/details/79105994

相關文章
相關標籤/搜索