php m3u8轉mp4

m3u8格式轉mp4

例如現有一個m3u8格式的視頻地址:https://rescdn.yishihui.com/longvideo/videocomposite/output/live/696380/1583998162597time-1LD.m3u8?Expires=1585381145&OSSAccessKeyId=LTAIHZz0zdTMC7HN&Signature=nrihRPuLby7Lm8F92P3NtoXdlIo%3D,需要下載爲mp4格式,解決思路:

通過m3u8格式的視頻地址下載m3u8文件,文檔編輯模式打開下載下來的m3u8文件,裏面有所有ts文件,上面地址下載的m3u8文件打開是這樣的:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:19
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:18.640000,
1583998162597time-1LD-00001.ts
#EXTINF:10.000000,
1583998162597time-1LD-00002.ts
#EXTINF:8.400000,
1583998162597time-1LD-00003.ts
#EXTINF:10.000000,
1583998162597time-1LD-00004.ts
#EXTINF:10.000000,
1583998162597time-1LD-00005.ts
#EXTINF:10.000000,
1583998162597time-1LD-00006.ts
#EXTINF:10.000000,
1583998162597time-1LD-00007.ts
#EXTINF:7.200000,
1583998162597time-1LD-00008.ts
#EXTINF:10.000000,
1583998162597time-1LD-00009.ts
#EXT-X-ENDLIST

上面只有ts的文件名,但是沒有ts的全路徑,需要用抓包工具去抓取上面m3u8視頻地址的網站點擊播放,抓取ts的地址拼接方式,我這邊抓到的是https://rescdn.yishihui.com/longvideo/videocomposite/output/live/696380/1583998162597time-1LD-00001.ts,所以得到ts拼接的前綴是:https://rescdn.yishihui.com/longvideo/videocomposite/output/live/696380/

下一步是通過字符串處理上面的m3u8文件,得到所有的ts文件名:1583998162597time-1LD-00001.ts、1583998162597time-1LD-00002.ts、1583998162597time-1LD-00003.ts、1583998162597time-1LD-00004.ts....然後按順序依次ts的內容,追加的方式存放到一個文件tmp_out.ts,然後利用插件(ffmpeg)轉換tmp_out.ts爲mp4格式,如果直接保存爲tmp_out.mp4的話,視頻播放軟件是可以播放的,但是網頁的形式是不能播放的,因爲字符編碼缺少了視頻信息,所以需要插件來轉換格式。

準備:安裝ffmpeg插件

windows安裝ffmpeg:

下載地址:https://ffmpeg.org/download.html

下載解壓,命令行進入到加壓文件夾/bin/目錄下就可以直接使用ffmpeg命令

 

linux安裝ffmpeg:

下載地址:https://ffmpeg.org/download.html

下載完上傳到linux服務器,解壓xz:

xz -d ffmpeg-git-amd64-static.tar.xz

解壓tar:

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

進入解壓目錄,編譯安裝:

cd ffmpeg
./ffmpeg

安裝完成

 

PHP完整的實現代碼:

<?php

$url = 'https://rescdn.yishihui.com/longvideo/videocomposite/output/live/696380/1583998162597time-1LD.m3u8?Expires=1585381145&OSSAccessKeyId=LTAIHZz0zdTMC7HN&Signature=nrihRPuLby7Lm8F92P3NtoXdlIo%3D';
$ts_content = file_get_contents($url);
$ts_content = explode(',', $ts_content);
$ts_file = array();
foreach ($ts_content as $key => $value) {
	if($key == 0) continue;
	$value = trim($value);
	$ts_file[] = substr($value, 0, strpos($value, '.ts') + 3);
}
$url_prefix = substr($url, 0, strpos($url, '.m3u8'));
$url_prefix = substr($url, 0, strrpos($url, '/') + 1);
$file_content = '';
foreach ($ts_file as $key => $value) {
	$file_content .= file_get_contents($url_prefix . $value);
}

file_put_contents('tmp_out.ts', $file_content);
// FFMPEG_PATH 是你自己解壓ffmpeg的bin路徑,例如我的是F:/ffmpeg/bin/
exec(FFMPEG_PATH . "ffmpeg -i tmp_out.ts tmp_out.mp4");

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章