php视频转码hls,GitHub - wanglimeng/ffmpeg-demo: 使用 ffmpeg 实现视频转码。
視頻轉(zhuǎn)碼示例
該 demo 的主要目的是為了學(xué)習(xí)如何使用 ffmpeg 實(shí)現(xiàn)視頻轉(zhuǎn)碼。
視頻轉(zhuǎn)碼程序 transcode.php 文件具備以下功能:
獲取視頻信息;
提取字幕;
將視頻轉(zhuǎn)碼成不同清晰度的 MP4 文件(視頻編碼 H.264,音頻編碼 AAC);
提高視頻音量;
轉(zhuǎn)換成 HLS 格式即 M3U8 + TS 的播放列表;
生成縮略圖和預(yù)覽圖;
生成劇照;
項(xiàng)目結(jié)構(gòu)
.
├── movie
│?? ├── 0
│?? │?? ├── example.mp4 # 測(cè)試視頻1
│?? │?? ├── hls # m3u8 和 ts 的存放目錄
│?? │?? ├── image_group # 預(yù)覽圖
│?? │?? ├── mp4 # 不同清晰度的 mp4 文件
│?? │?? ├── stage_photo # 劇照
│?? │?? ├── subtitle # 字幕
│?? │?? └── thumb.jpg # 縮略圖
│?? └── 1
│?? ├── example.mp4 # 測(cè)試視頻2
│?? ├── hls
│?? ├── image_group
│?? ├── mp4
│?? ├── stage_photo
│?? ├── subtitle
│?? └── thumb.jpg
├── movie_info_example.json # 獲取視頻信息的輸出示例
├── movie_info.php # 獲取視頻信息腳本
├── README.md
├── transcode0.log # 測(cè)試視頻0的執(zhí)行日志
├── transcode1.log # 測(cè)試視頻1的執(zhí)行日志
└── transcode.php # 視頻轉(zhuǎn)碼腳本
項(xiàng)目依賴
PHP 5+
注:本項(xiàng)目測(cè)試時(shí)使用的 ffmpeg 是 2.8.15 版本。
ffmpeg 在 Ubuntu 的安裝方法:
sudo apt-get install ffmpeg
轉(zhuǎn)碼步驟說(shuō)明
1. 獲取視頻信息
ffprobe -v quiet -print_format json -show_streams -show_format /www/web/ffmpeg-demo/movie/0/example.mp4
參數(shù)說(shuō)明:
print_format:輸出格式,這里設(shè)置為 json 輸出;
show_streams:顯示 streams 信息;
show_format:顯示封裝格式信息;
2. 從原視頻提取字幕文件
ffmpeg -v quiet -analyzeduration 100000000 -i /www/web/ffmpeg-demo/movie/example.mkv -map 0:3 -y /www/web/ffmpeg-demo/movie/subtitle/subtitle_3.srt
ffmpeg -v quiet -analyzeduration 100000000 -i /www/web/ffmpeg-demo/movie/example.mkv -map 0:4 -y /www/web/ffmpeg-demo/movie/subtitle/subtitle_4.srt
ffmpeg -v quiet -analyzeduration 100000000 -i /www/web/ffmpeg-demo/movie/example.mkv -map 0:5 -y /www/web/ffmpeg-demo/movie/subtitle/subtitle_5.srt
ffmpeg -v quiet -analyzeduration 100000000 -i /www/web/ffmpeg-demo/movie/example.mkv -map 0:6 -y /www/web/ffmpeg-demo/movie/subtitle/subtitle_6.srt
說(shuō)明:由于本倉(cāng)庫(kù)中的兩個(gè) example.mp4 都沒(méi)有字幕,所以這條命令對(duì)于它們都是無(wú)效的,讀者可自行下載帶字幕的視頻測(cè)試。
3. 將視頻轉(zhuǎn)碼成不同的清晰度
ffmpeg -analyzeduration 100000000 -i /www/web/ffmpeg-demo/movie/0/example.mp4 -sn -dn \
-t 102.981000 -map 0:0 -vsync 1 -c:v libx264 -b:v 552k -r 15 -s 640x360 -aspect 640:360 -map 0:1 -c:a aac -strict -2 -b:a 48k -ar 44100 -ac 1 -qdiff 4 -qcomp 0.6 -subq 9 -preset slower -me_range 32 -coder ac -me_method umh -pix_fmt yuv420p -keyint_min 15 -refs 4 -bf 4 -movflags +faststart -y /www/web/ffmpeg-demo/movie/0/mp4/1.mp4 \
-t 102.981000 -map 0:0 -vsync 1 -c:v libx264 -b:v 828k -r 15 -s 1024x576 -aspect 1024:576 -map 0:1 -c:a aac -strict -2 -b:a 72k -ar 44100 -ac 1 -qdiff 4 -qcomp 0.6 -subq 9 -preset slower -me_range 32 -coder ac -me_method umh -pix_fmt yuv420p -keyint_min 15 -refs 3 -bf 3 -movflags +faststart -y /www/web/ffmpeg-demo/movie/0/mp4/2.mp4 \
-t 102.981000 -map 0:0 -vsync 1 -c:v libx264 -b:v 1072k -r 20 -s 1280x720 -aspect 1280:720 -map 0:1 -c:a aac -strict -2 -b:a 128k -ar 44100 -ac 2 -qdiff 4 -qcomp 0.6 -subq 9 -preset slower -me_range 32 -coder ac -me_method umh -pix_fmt yuv420p -keyint_min 20 -refs 3 -bf 2 -movflags +faststart -y /www/web/ffmpeg-demo/movie/0/mp4/3.mp4 \
-t 102.981000 -map 0:0 -vsync 1 -c:v libx264 -b:v 2208k -r 25 -s 1920x1080 -aspect 1920:1080 -map 0:1 -c:a aac -strict -2 -b:a 384k -ar 44100 -qdiff 4 -qcomp 0.6 -subq 9 -preset slower -me_range 32 -coder ac -me_method umh -pix_fmt yuv420p -keyint_min 25 -refs 3 -bf 2 -movflags +faststart -y /www/web/ffmpeg-demo/movie/0/mp4/4.mp4
參數(shù)說(shuō)明:
-vsync:用于控制改變幀率時(shí),丟幀的方法;
-c:v:設(shè)置視頻編碼器
-b:v:設(shè)置視頻碼率
-r:設(shè)置幀率
-s:設(shè)置分辨率
-aspect: 設(shè)置畫面比例
-c:a:設(shè)置音頻編碼器
-b:a:設(shè)置音頻碼率
-ar:設(shè)置音頻采樣率
-t:設(shè)置輸出文件播放時(shí)長(zhǎng)
-map:映射碼流,如果后面的參數(shù)是視頻,就是視頻碼流;如果后面的參數(shù)是音頻,就是音頻碼流
-ac:設(shè)置音頻聲道數(shù)
-y:默認(rèn)覆蓋輸出文件
-qdiff:編碼質(zhì)量差(根據(jù)經(jīng)驗(yàn)調(diào))
-qcomp:量化曲線壓縮參數(shù)(根據(jù)經(jīng)驗(yàn)調(diào))
-subq:Sub-pixel 運(yùn)動(dòng)估算方法
-preset:編碼預(yù)設(shè)值(根據(jù)經(jīng)驗(yàn)調(diào))
-me_range:運(yùn)動(dòng)搜索最大范圍(根據(jù)經(jīng)驗(yàn)調(diào))
-coder:設(shè)置熵編碼器
-me_method:設(shè)置運(yùn)動(dòng)估算方法
-refs:設(shè)置運(yùn)動(dòng)補(bǔ)償?shù)膮⒖紟瑪?shù)量
-bf:設(shè)置非 B 幀之間的最大 B 幀數(shù)量
-movflags faststart:將頭信息挪到文件頭
清晰度劃分
清晰度
標(biāo)識(shí)ID
編碼器
幀率
寬
總碼率
音頻碼率
聲道數(shù)
標(biāo)清
1
gpu>cpu
15
640
600
48
1
高清
2
gpu>cpu
15
1024
900
72
1
超清
3
gpu>cpu
20
1280
1200
128
2
1080P
4
cpu
25
1920
2400
192*聲道數(shù)
與片源文件一樣
4K
5
cpu
25
3940
6000
256*聲道數(shù)
與片源文件一樣
原畫
100
動(dòng)態(tài)
動(dòng)態(tài)
動(dòng)態(tài)
動(dòng)態(tài)
動(dòng)態(tài)
動(dòng)態(tài)
說(shuō)明:原畫是為了轉(zhuǎn)碼后的視頻播放時(shí)清晰度跟原視頻更接近而設(shè)。
因?yàn)橛行┮曨l的寬度在 640-1024、1024-1280 等之間,這些視頻如果被轉(zhuǎn)成低清晰度,效果將沒(méi)有那么好。
3.1 提高視頻音量
有些視頻的音量比較低,需要通過(guò)轉(zhuǎn)碼提高音量,以下是獲取音量信息的命令,提高音量的命令請(qǐng)查看源代碼。
ffmpeg -i /www/web/ffmpeg-demo/movie/0/example.mp4 -map 0:a -q:a 0 -af volumedetect -f null null
參數(shù)說(shuō)明:
-q:a:設(shè)置音頻質(zhì)量,0 為原始音頻質(zhì)量
-af:音頻濾鏡
-f:指定輸出格式
4. 轉(zhuǎn)換成 HLS 格式
ffmpeg -i /www/web/ffmpeg-demo/movie/0/mp4/1.mp4 -map 0 -c copy -bsf h264_mp4toannexb -f segment -segment_list /www/web/ffmpeg-demo/movie/0/hls/1.m3u8 -segment_time 10 -y /www/web/ffmpeg-demo/movie/0/hls/1_%05d.ts
ffmpeg -i /www/web/ffmpeg-demo/movie/0/mp4/2.mp4 -map 0 -c copy -bsf h264_mp4toannexb -f segment -segment_list /www/web/ffmpeg-demo/movie/0/hls/2.m3u8 -segment_time 10 -y /www/web/ffmpeg-demo/movie/0/hls/2_%05d.ts
ffmpeg -i /www/web/ffmpeg-demo/movie/0/mp4/3.mp4 -map 0 -c copy -bsf h264_mp4toannexb -f segment -segment_list /www/web/ffmpeg-demo/movie/0/hls/3.m3u8 -segment_time 10 -y /www/web/ffmpeg-demo/movie/0/hls/3_%05d.ts
ffmpeg -i /www/web/ffmpeg-demo/movie/0/mp4/4.mp4 -map 0 -c copy -bsf h264_mp4toannexb -f segment -segment_list /www/web/ffmpeg-demo/movie/0/hls/4.m3u8 -segment_time 10 -y /www/web/ffmpeg-demo/movie/0/hls/4_%05d.ts
5. 生成縮略圖、預(yù)覽圖
ffmpeg -analyzeduration 100000000 -i /www/web/ffmpeg-demo/movie/0/mp4/1.mp4 \
-vsync 0 -ss 51.4905 -frames:v 1 -s 220x123 -f image2 -y /www/web/ffmpeg-demo/movie/0/thumb.jpg \
-vsync 1 -vf 'fps=1/2,scale=160:90,tile=6x5' -f image2 -y /www/web/ffmpeg-demo/movie/0/image_group/%d.jpg
參數(shù)說(shuō)明:
fps=1/2 2 每隔 2 秒截取一張圖片;
scale=160:90 每張小圖的長(zhǎng)為 160,寬為 90;
tile=6x5 每張預(yù)覽圖每列放 6 張小圖、每行放 5 張小圖;
6. 生成劇照
ffmpeg -analyzeduration 100000000 -ss 10 -i /www/web/ffmpeg-demo/movie/0/mp4/4.mp4 -map 0:v -t 82 -vf 'fps=fps=1/2.74616' -f image2 -y /www/web/ffmpeg-demo/movie/0/stage_photo/%03d.jpg
參數(shù)說(shuō)明:
-ss 10 從第 10 開(kāi)始截圖;
-t 82 截圖的視頻時(shí)長(zhǎng)為 82 秒;
最后
以上是使用 CPU 進(jìn)行轉(zhuǎn)碼,若需要加速應(yīng)該使用 GPU 進(jìn)行轉(zhuǎn)碼,此時(shí)的轉(zhuǎn)碼命令需要做一些修改,這部分讀者可以查閱相關(guān)文檔自行完成。
另外,以上例子僅僅是為了展示 ffmpeg 的基本用法,很多命令的參數(shù)需要根據(jù)自己的業(yè)務(wù)場(chǎng)景進(jìn)行調(diào)整,讀者務(wù)必注意。
播放轉(zhuǎn)碼后的 M3U8 文件,可參考 player 目錄的示例。
參考文獻(xiàn)
總結(jié)
以上是生活随笔為你收集整理的php视频转码hls,GitHub - wanglimeng/ffmpeg-demo: 使用 ffmpeg 实现视频转码。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: redis缓存与数据库一致性问题解决
- 下一篇: 2-PHP代码审计——PHPCMSV9.