使用webman下使用PHP-FFMpeg,將mp4轉碼為m3u8格式,轉碼完成后,有40個ts文件和一個m3u8目錄文件
但是播放器播放只能播放出最后5個ts切片
環(huán)境:php8.0 \ ffmpeg7.0 \ PHP-FFMpeg v1.2
(原視頻差不多兩分鐘)
$ffmpeg = FFMpeg::create([
'ffmpeg.binaries' => getenv('FFMPEG_PATH'),
'ffprobe.binaries' => getenv('FFMROBE_PATH'),
'timeout' => 3600, // 設置超時時間
'ffmpeg.threads' => 12, // 設置線程數(shù)
]);
$format = new \FFMpeg\Format\Video\X264();
// 打開要轉換的 MP4 文件
$video = $ffmpeg->open($vo['save_path']);
$format
->setKiloBitrate(1000)
->setAudioChannels(2)
->setAudioKiloBitrate(256);
$dir = dirname($vo['save_path']);
// 保存 M3U8 文件
if (!is_dir($dir)) {
// 目錄不存在,嘗試創(chuàng)建目錄
mkdir($dir, 0777, true); // 第三個參數(shù)設置為 true 以創(chuàng)建多級目錄
}
$video_name = 'new_video';
$res = $video->save($format,$dir.DIRECTORY_SEPARATOR.$video_name . '.m3u8');
把你的帖子發(fā)給Gemini,它回復如下:
根據(jù)你提供的代碼,我發(fā)現(xiàn)了一個潛在的問題:
$res = $video->save($format,$dir.DIRECTORY_SEPARATOR.$video_name . '.m3u8');
在這個代碼中,你只保存了 M3U8 文件,但是沒有保存對應的 TS 分片文件。
要生成完整的 M3U8 格式視頻,你需要使用 saveFromSameFile
方法,如下所示:
$res = $video->saveFromSameFile($format,$dir.DIRECTORY_SEPARATOR.$video_name . '.m3u8');
這樣,PHP-FFMpeg 就會自動生成 TS 分片文件并將其保存在指定的目錄中。
另外,你還可以通過設置以下選項來優(yōu)化轉碼過程:
hlsManifestType
: 指定 M3U8 清單類型(例如,HLS_MANIFEST_TYPE_VOD
)hlsTime
: 指定每個 TS 分片的持續(xù)時間(以秒為單位)hlsSegmentCount
: 指定 M3U8 清單中包含的分片數(shù)量例如:
$format
->setHlsManifestType(FFMpeg\Format\Video\X264::HLS_MANIFEST_TYPE_VOD)
->setHlsTime(5) // 5 秒的分片持續(xù)時間
->setHlsSegmentCount(40); // 40 個分片
這些設置將有助于生成更適合播放的 M3U8 格式視頻。
TS分片文件都有,40個,播放時只能播放36~40
Gemini、kimi、gpt都問過了,它們回答的使用方法,都試過了,還是這樣,我的ffmpeg版本是6.1