php视频转码hls,GitHub - wanglimeng/ffmpeg-demo: 使用 ffmpeg 实现视频转码。
視頻轉碼示例
該 demo 的主要目的是為了學習如何使用 ffmpeg 實現視頻轉碼。
視頻轉碼程序 transcode.php 文件具備以下功能:
獲取視頻信息;
提取字幕;
將視頻轉碼成不同清晰度的 MP4 文件(視頻編碼 H.264,音頻編碼 AAC);
提高視頻音量;
轉換成 HLS 格式即 M3U8 + TS 的播放列表;
生成縮略圖和預覽圖;
生成劇照;
項目結構
.
├── movie
│?? ├── 0
│?? │?? ├── example.mp4 # 測試視頻1
│?? │?? ├── hls # m3u8 和 ts 的存放目錄
│?? │?? ├── image_group # 預覽圖
│?? │?? ├── mp4 # 不同清晰度的 mp4 文件
│?? │?? ├── stage_photo # 劇照
│?? │?? ├── subtitle # 字幕
│?? │?? └── thumb.jpg # 縮略圖
│?? └── 1
│?? ├── example.mp4 # 測試視頻2
│?? ├── hls
│?? ├── image_group
│?? ├── mp4
│?? ├── stage_photo
│?? ├── subtitle
│?? └── thumb.jpg
├── movie_info_example.json # 獲取視頻信息的輸出示例
├── movie_info.php # 獲取視頻信息腳本
├── README.md
├── transcode0.log # 測試視頻0的執行日志
├── transcode1.log # 測試視頻1的執行日志
└── transcode.php # 視頻轉碼腳本
項目依賴
PHP 5+
注:本項目測試時使用的 ffmpeg 是 2.8.15 版本。
ffmpeg 在 Ubuntu 的安裝方法:
sudo apt-get install ffmpeg
轉碼步驟說明
1. 獲取視頻信息
ffprobe -v quiet -print_format json -show_streams -show_format /www/web/ffmpeg-demo/movie/0/example.mp4
參數說明:
print_format:輸出格式,這里設置為 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
說明:由于本倉庫中的兩個 example.mp4 都沒有字幕,所以這條命令對于它們都是無效的,讀者可自行下載帶字幕的視頻測試。
3. 將視頻轉碼成不同的清晰度
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
參數說明:
-vsync:用于控制改變幀率時,丟幀的方法;
-c:v:設置視頻編碼器
-b:v:設置視頻碼率
-r:設置幀率
-s:設置分辨率
-aspect: 設置畫面比例
-c:a:設置音頻編碼器
-b:a:設置音頻碼率
-ar:設置音頻采樣率
-t:設置輸出文件播放時長
-map:映射碼流,如果后面的參數是視頻,就是視頻碼流;如果后面的參數是音頻,就是音頻碼流
-ac:設置音頻聲道數
-y:默認覆蓋輸出文件
-qdiff:編碼質量差(根據經驗調)
-qcomp:量化曲線壓縮參數(根據經驗調)
-subq:Sub-pixel 運動估算方法
-preset:編碼預設值(根據經驗調)
-me_range:運動搜索最大范圍(根據經驗調)
-coder:設置熵編碼器
-me_method:設置運動估算方法
-refs:設置運動補償的參考幀數量
-bf:設置非 B 幀之間的最大 B 幀數量
-movflags faststart:將頭信息挪到文件頭
清晰度劃分
清晰度
標識ID
編碼器
幀率
寬
總碼率
音頻碼率
聲道數
標清
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*聲道數
與片源文件一樣
4K
5
cpu
25
3940
6000
256*聲道數
與片源文件一樣
原畫
100
動態
動態
動態
動態
動態
動態
說明:原畫是為了轉碼后的視頻播放時清晰度跟原視頻更接近而設。
因為有些視頻的寬度在 640-1024、1024-1280 等之間,這些視頻如果被轉成低清晰度,效果將沒有那么好。
3.1 提高視頻音量
有些視頻的音量比較低,需要通過轉碼提高音量,以下是獲取音量信息的命令,提高音量的命令請查看源代碼。
ffmpeg -i /www/web/ffmpeg-demo/movie/0/example.mp4 -map 0:a -q:a 0 -af volumedetect -f null null
參數說明:
-q:a:設置音頻質量,0 為原始音頻質量
-af:音頻濾鏡
-f:指定輸出格式
4. 轉換成 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. 生成縮略圖、預覽圖
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
參數說明:
fps=1/2 2 每隔 2 秒截取一張圖片;
scale=160:90 每張小圖的長為 160,寬為 90;
tile=6x5 每張預覽圖每列放 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
參數說明:
-ss 10 從第 10 開始截圖;
-t 82 截圖的視頻時長為 82 秒;
最后
以上是使用 CPU 進行轉碼,若需要加速應該使用 GPU 進行轉碼,此時的轉碼命令需要做一些修改,這部分讀者可以查閱相關文檔自行完成。
另外,以上例子僅僅是為了展示 ffmpeg 的基本用法,很多命令的參數需要根據自己的業務場景進行調整,讀者務必注意。
播放轉碼后的 M3U8 文件,可參考 player 目錄的示例。
參考文獻
總結
以上是生活随笔為你收集整理的php视频转码hls,GitHub - wanglimeng/ffmpeg-demo: 使用 ffmpeg 实现视频转码。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis缓存与数据库一致性问题解决
- 下一篇: 2-PHP代码审计——PHPCMSV9.