国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用PHP結(jié)合Ffmpeg快速搭建流媒體服務(wù)實(shí)踐

MASAILA / 2902人閱讀

摘要:一背景筆者想將自己收藏的一些電影放到網(wǎng)站上可以用來隨時(shí)播放,不過遇到了一個(gè)問題,便是如果直接將文件放放到網(wǎng)站目錄當(dāng)中,手機(jī)端必須下載整個(gè)視頻才可以播放,而如果跨外網(wǎng)傳輸,這實(shí)在是不太現(xiàn)實(shí)。

一、背景

筆者想將自己收藏的一些電影放到網(wǎng)站上可以用來隨時(shí)播放,不過遇到了一個(gè)問題,便是如果直接將MP4文件放放到網(wǎng)站目錄當(dāng)中,手機(jī)端必須下載整個(gè)視頻才可以播放,而如果跨外網(wǎng)傳輸,這實(shí)在是不太現(xiàn)實(shí)。

為了解決這個(gè)問題,便想著搭建一套流媒體服務(wù),這樣手機(jī)就可以邊看邊下載,查詢了一些資料了了解到需要先將視頻分成一小片來傳輸,比如將MP4轉(zhuǎn)碼為M3U8格式,查詢了相關(guān)轉(zhuǎn)碼方法,比較主流的方式是使用ffmpeg這個(gè)開源工具

二、操作概要
1. 安裝Ffmpeg
2. 服務(wù)搭建
3. 功能測試
三、搭建ffmpeg

視頻轉(zhuǎn)碼的工具可能有很多,但開源且使用人數(shù)最多的還是莫過于ffmpeg這個(gè)工具,具體功能筆者不在這里詳細(xì)講解;安裝此工具的方式有很多,比如apt安裝、源碼安裝、docker安裝等等,不過docker是跨平臺(tái)的,因此筆者這里將以docker方式安裝為例

3.1 鏡像下載

首先筆者需要下載對(duì)應(yīng)的docker鏡像,參考命令如下

docker pull jrottenberg/ffmpeg

命令執(zhí)行過程中將會(huì)從遠(yuǎn)處下載鏡像,這個(gè)時(shí)間由當(dāng)前的網(wǎng)絡(luò)帶寬所決定,當(dāng)下載完成之后,可以看到如下參考信息

Using default tag: latest
latest: Pulling from jrottenberg/ffmpeg
b234f539f7a1: Pull complete
55172d420b43: Pull complete
5ba5bbeb6b91: Pull complete
43ae2841ad7a: Pull complete
f6c9c6de4190: Pull complete
2a0ef76bfa54: Pull complete
40ddf796a4bb: Pull complete
32ba137d2764: Pull complete
Digest: sha256:bcf65375f593518de7e450fd6b775d16a047d3ded00957c2e794e2fe8f7e1590
Status: Downloaded newer image for jrottenberg/ffmpeg:latest
3.2 容器運(yùn)行

當(dāng)容器下載完畢之后,可以用一些命令進(jìn)行驗(yàn)證是否能夠正常運(yùn)行,如下參考命令

docker run jrottenberg/ffmpeg

命令執(zhí)行完畢之后,會(huì)返回如下結(jié)果

Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Getting help:

..... 省略

Audio options:
-aframes number     set the number of audio frames to output
-aq quality         set audio quality (codec-specific)
-ar rate            set audio sampling rate (in Hz)
-ac channels        set number of audio channels
-an                 disable audio
-acodec codec       force audio codec ("copy" to copy stream)
-vol volume         change audio volume (256=normal)
-af filter_graph    set audio filters

Subtitle options:
-s size             set frame size (WxH or abbreviation)
-sn                 disable subtitle
-scodec codec       force subtitle codec ("copy" to copy stream)
-stag fourcc/tag    force subtitle tag/fourcc
-fix_sub_duration   fix subtitles duration
-canvas_size size   set canvas size (WxH or abbreviation)
-spre preset        set the subtitle options to the indicated preset
3.3 查看支持協(xié)議

FFmpeg所支持的輸入輸出協(xié)議非常多,比如可以選擇file協(xié)議作為來源,使用hls協(xié)議作為輸出結(jié)果,具體所支持的協(xié)議可以通過如下命令查看

docker run jrottenberg/ffmpeg   -protocols

執(zhí)行命令之后,參考結(jié)果如下

ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 20160609
  configuration: --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-avresample --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-gpl --enable-libass --enable-libfreetype --enable-libvidstab --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libtheora --enable-libvorbis
  ..... 省略
  Supported file protocols:
Input:
  async
  cache
  concat
  crypto
  data
  ..... 省略
Output:
  crypto
  file
  ..... 省略
  tls
  udp
3.4 轉(zhuǎn)換測試

現(xiàn)在筆者使用FFmpeg對(duì)視頻進(jìn)行轉(zhuǎn)碼測試,命令非常簡單,首先需要通過-v將視頻所在的目錄掛載到容器中,然后使用-i選項(xiàng)找到容器中對(duì)應(yīng)的視頻文件;

接著就可以對(duì)編碼進(jìn)行一些選項(xiàng),比如-hls_time 10便是將文件沒10秒輸出一個(gè)TS文件,-hls_list_size 0 則是在m3u8文件中記錄所以ts文件(默認(rèn)是記錄最后五個(gè)TS文件),參數(shù)最后則填寫文件輸出路徑,具體參考命令如下:

docker run -v /Users/song/video:/root/download  jrottenberg/ffmpeg:latest -i /root/download/1.mp4  -hls_time 10 -hls_list_size 0 -f hls /root/download/index.m3u8

命令執(zhí)行過程中會(huì)展示轉(zhuǎn)換進(jìn)度,參考如下返回所示

  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    encoder         : Lavf57.83.100
    Stream #0:0(eng): Video: h264 (libx264), yuv420p(progressive), 1920x1080, q=-1--1, 30 fps, 90k tbn, 30 tbc (default)
    Metadata:
      creation_time   : 2018-08-21T15:09:24.000000Z
      handler_name    : Alias Data Handler
      encoder         : Lavc57.107.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    Stream #0:1(eng): Audio: aac, 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2018-08-21T15:09:24.000000Z
      handler_name    : Alias Data Handler
      encoder         : Lavc57.107.100 aac
frame=   82 fps= 12 q=29.0 size=N/A time=00:00:02.62 bitrate=N/A speed=0.381x

此時(shí)便可以在剛才的掛載點(diǎn)查看TS文件,如下圖所示

現(xiàn)在筆者將剛才的TS文件都刪除,在下面將使用自動(dòng)化完成。

四、服務(wù)搭建

在上一步中筆者已經(jīng)成功通過終端使用FFmpeg將視頻進(jìn)行轉(zhuǎn)碼,下面筆者將結(jié)合PHP代碼將這些操作完全自動(dòng)化實(shí)現(xiàn),這樣便可以達(dá)到通過手機(jī)訪問網(wǎng)站,服務(wù)端自動(dòng)完成轉(zhuǎn)碼播放的需求,這個(gè)過程包括創(chuàng)建虛擬主機(jī)、編寫展示視頻列表、視頻自動(dòng)解碼三個(gè)部分

4.1 創(chuàng)建虛擬主機(jī)

首先筆者需要借助nginx搭建一個(gè)web服務(wù),這時(shí)便需要修改配置文件,但并不記得nginx配置文件存放位置,此時(shí)可以借助如下命令

sudo nginx -t

得到結(jié)果如下,在結(jié)果中可以便可以看到nginx的配置文件存放位置

nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

使用vim編輯器直接編輯nginx配置文件

vim /usr/local/etc/nginx/nginx.conf

然后在配置文件中加入如下參考配置信息

    server {
        listen       8089;
        server_name  localhost;
        root  /Users/song/mycode/work/test/video;
        location / {
            index index.html index.htm index.php; 
        }

        location ~ .php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

    }
4.2 獲取視頻列表

nginx配置完成之后,便需要編寫PHP代碼,通過PHP可以獲取到目錄的視頻列表,然后將其輸出到網(wǎng)頁當(dāng)中,參考代碼如下所示

 $val) {
        if (!in_array(pathinfo($val, PATHINFO_EXTENSION), ["mp4", "rmvb", "wmv"])) {
            continue;
        }

        ?>

        
            

在代碼中,首先通過scandir讀取文件夾下所有文件,然后進(jìn)行foreach循環(huán),通過后綴名來判斷是否為視頻文件,如果是視頻文件,則輸出一個(gè)鏈接地址方便用戶選擇。

4.3 進(jìn)行視頻轉(zhuǎn)碼

上面的代碼在列出視頻列表之后,當(dāng)用戶點(diǎn)擊鏈接后就需要使用FFmpeg進(jìn)行轉(zhuǎn)碼,參考代碼如下

> ./code.log &";
system($cmd);


//延時(shí)執(zhí)行跳轉(zhuǎn)
returnUrl($fileName);

function getFileName($filename)
{
    $houzhui = substr(strrchr($filename, "."), 1);
    $result = basename($filename, "." . $houzhui);

    return $result;

}

function returnUrl($fileName)
{
    echo "

正在處理中...點(diǎn)擊進(jìn)行跳轉(zhuǎn)

"; die; }

在上面代碼當(dāng)中,考慮文件是否已經(jīng)被轉(zhuǎn)碼,如果已經(jīng)轉(zhuǎn)碼過了直接返回播放地址,否則創(chuàng)建一個(gè)存放TS文件的文件夾,然后進(jìn)行轉(zhuǎn)碼,轉(zhuǎn)碼的時(shí)候使用nohup命令可以讓FFmpeg異步執(zhí)行,然后PHP返回播放地址。

五、檢驗(yàn)與測試

通過前面的步驟,筆者已經(jīng)完整的搭建了一套流媒體服務(wù)器,下面將檢驗(yàn)這些服務(wù)是否能否正常運(yùn)行,包括視頻列表展示、視頻轉(zhuǎn)碼是否正常、已經(jīng)轉(zhuǎn)碼的視頻能否播放

5.1 視頻列表

首先通過瀏覽器打開URL地址如下

http://localhost:8089/

加載完成之后可以看到如下的視頻列表

讀者如果將上方的代碼運(yùn)行界面有稍有差異,因?yàn)楣P者為了節(jié)省文章篇幅,并沒有將樣式代碼放到文章當(dāng)中,如需界面好看可以自行編寫樣式代碼。

5.2 視頻轉(zhuǎn)碼

在視頻列表點(diǎn)擊一個(gè)鏈接之后,后臺(tái)PHP程序?qū)?huì)執(zhí)行轉(zhuǎn)碼任務(wù),然后返回一個(gè)鏈接地址,如下圖所示

此時(shí)便代表FFmpeg已經(jīng)在后臺(tái)運(yùn)行,可以通過如下命令進(jìn)行查看FFmpeg這個(gè)容器的運(yùn)行狀態(tài),參考命令如下

docker ps

返回的參考結(jié)果如下所示

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS               NAMES
ac3e7233eb9f        jrottenberg/ffmpeg:latest   "ffmpeg -i /root/dow…"   1 hours ago        Up 1 hours                             keen_feynman

從上面的返回結(jié)果當(dāng)中可以看出當(dāng)前正有一個(gè)任務(wù)處于運(yùn)行狀態(tài),此時(shí)打開視頻輸出目錄,會(huì)看到有多個(gè)ts格式的視頻文件,這些文件是剛在通過PHP自動(dòng)執(zhí)行所產(chǎn)生的,如下圖所示

當(dāng)看到如上圖的轉(zhuǎn)碼視頻文件時(shí),便可以通過瀏覽器進(jìn)行訪問

5.3 視頻播放

這里需要記住,HLS協(xié)議是蘋果公司所開發(fā)的,因此除了蘋果的瀏覽器外,其他瀏覽器默認(rèn)都是不支持m3u8的解析的,如果需要使用其他瀏覽器播放,需要安裝插件;蘋果的默認(rèn)就支持則不需要

筆者重新通過Safari瀏覽器打開頁面,然后再次選擇1.mp4視頻,則直接跳轉(zhuǎn)到了播放頁面,如下圖所示

看到這里,搭建流媒體就基本已經(jīng)完成了,如果需要將更多視頻播放,只需要將視頻文件存放到指定的視頻目錄,網(wǎng)頁中便會(huì)自動(dòng)讀取出來,頁面可能太簡化,讀者可以根據(jù)自己的需要將html頁面美化一下。

六、新書推薦

如果對(duì)筆者的實(shí)戰(zhàn)文章較為感興趣,可以關(guān)注筆者新書《PHP Web安全開發(fā)實(shí)戰(zhàn)》,現(xiàn)已在各大平臺(tái)上架銷售,封面如下圖所示

作者:湯青松

微信:songboy8888

日期:2018-10-28

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/27522.html

相關(guān)文章

  • 使用PHP結(jié)合Ffmpeg快速搭建媒體服務(wù)實(shí)踐

    摘要:一背景筆者想將自己收藏的一些電影放到網(wǎng)站上可以用來隨時(shí)播放,不過遇到了一個(gè)問題,便是如果直接將文件放放到網(wǎng)站目錄當(dāng)中,手機(jī)端必須下載整個(gè)視頻才可以播放,而如果跨外網(wǎng)傳輸,這實(shí)在是不太現(xiàn)實(shí)。 一、背景 筆者想將自己收藏的一些電影放到網(wǎng)站上可以用來隨時(shí)播放,不過遇到了一個(gè)問題,便是如果直接將MP4文件放放到網(wǎng)站目錄當(dāng)中,手機(jī)端必須下載整個(gè)視頻才可以播放,而如果跨外網(wǎng)傳輸,這實(shí)在是不太現(xiàn)實(shí)。...

    Drinkey 評(píng)論0 收藏0
  • 獨(dú)立開發(fā)變現(xiàn)周刊(第 24期):2021全球范圍內(nèi)數(shù)字游民的用戶畫像是什么?

    摘要:分享的原文鏈接全球范圍內(nèi)數(shù)字游民的用戶畫像是什么網(wǎng)站跟蹤數(shù)以萬計(jì)的地點(diǎn)獨(dú)立遠(yuǎn)程工作者,而形成了這個(gè)報(bào)告。遠(yuǎn)程工作現(xiàn)在正處于指數(shù)增長的軌道上,而且增長迅速。大家好,我是王皓,獨(dú)立開發(fā)者,寧皓網(wǎng)的作者。 .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:...

    enrecul101 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<