php-FFMpeg视频转码成m3u8,为什么只能播放最后几个切片?

yoyo_admin

问题描述

使用webman下使用PHP-FFMpeg,将mp4转码为m3u8格式,转码完成后,有40个ts文件和一个m3u8目录文件
但是播放器播放只能播放出最后5个ts切片
环境: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, // 设置线程数
]);
$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)) {
                // 目录不存在,尝试创建目录
                mkdir($dir, 0777, true); // 第三个参数设置为 true 以创建多级目录
            }
            $video_name = 'new_video';
            $res = $video->save($format,$dir.DIRECTORY_SEPARATOR.$video_name . '.m3u8');
265 1 0
1个回答

wocall

把你的帖子发给Gemini,它回复如下:

根据你提供的代码,我发现了一个潜在的问题:

$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 分片文件并将其保存在指定的目录中。

另外,你还可以通过设置以下选项来优化转码过程:

  • hlsManifestType: 指定 M3U8 清单类型(例如,HLS_MANIFEST_TYPE_VOD
  • hlsTime: 指定每个 TS 分片的持续时间(以秒为单位)
  • hlsSegmentCount: 指定 M3U8 清单中包含的分片数量

例如:

$format
    ->setHlsManifestType(FFMpeg\Format\Video\X264::HLS_MANIFEST_TYPE_VOD)
    ->setHlsTime(5)  // 5 秒的分片持续时间
    ->setHlsSegmentCount(40);  // 40 个分片

这些设置将有助于生成更适合播放的 M3U8 格式视频。

  • yoyo_admin 12天前

    TS分片文件都有,40个,播放时只能播放36~40
    Gemini、kimi、gpt都问过了,它们回答的使用方法,都试过了,还是这样,我的ffmpeg版本是6.1

  • wocall 10天前

    你看看m3u8文件里,是不是不全,或者指错了

  • 小W 9天前

    有没有可能m3u8只有最后5个列表

×
🔝