You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS SDK for PHP上传HLS视频失败:仅.m3u8上传,.ts留存本地

解决AWS SDK for PHP上传HLS视频分片(.ts文件)的问题

看起来你现在的代码只处理了.m3u8文件的上传,而HLS视频依赖的所有.ts分片文件并没有被纳入上传流程——这就是为什么只有索引文件到了S3,分片都留在本地的原因。结合你的代码片段,给你几个针对性的解决思路:

1. 遍历并上传所有.ts分片文件

在FFmpeg生成HLS完成后,你需要主动找到目标目录下所有的.ts文件,逐个用AWS SDK完成上传。可以用PHP的glob()函数快速匹配分片文件:

// 假设你的HLS文件都存储在$structure目录下
$hlsDir = $structure;

// 先执行你原本的.m3u8文件上传逻辑
$s3->putObject([
    'Bucket' => '你的S3存储桶名称',
    'Key' => '远程存储路径/' . basename($hls_link),
    'SourceFile' => $hls_link,
    'ContentType' => 'application/vnd.apple.mpegurl'
]);

// 遍历目录下所有.ts文件并上传
$tsFiles = glob($hlsDir . '/*.ts');
foreach ($tsFiles as $tsFile) {
    if (is_file($tsFile)) {
        $s3->putObject([
            'Bucket' => '你的S3存储桶名称',
            'Key' => '远程存储路径/' . basename($tsFile),
            'SourceFile' => $tsFile,
            'ContentType' => 'video/MP2T'
        ]);
    }
}

2. 检查FFmpeg生成HLS的路径是否正确

先确认FFmpeg生成的.ts文件确实在你指定的$structure目录下,可以加一段调试代码验证:

// 调试:列出目标目录下的所有文件
$filesInDir = scandir($hlsDir);
print_r($filesInDir);

如果发现.ts文件不在该目录,需要调整FFmpeg的HLS输出参数,确保分片文件路径正确,比如:

ffmpeg -i input.mp4 -hls_time 10 -hls_segment_filename "$structure/%03d.ts" "$hls_link"

3. 验证S3上传的路径一致性

确保.m3u8文件里引用的分片路径,和你上传到S3的Key路径完全匹配——比如如果.m3u8里写的是001.ts,那.ts文件必须上传到S3的同目录下,否则播放时会找不到分片资源。

4. 可选:用Transfer Manager批量上传(高效处理大量分片)

如果你的HLS分片数量很多,推荐使用AWS SDK的Transfer Manager批量上传,它能自动处理重试、并发上传,效率更高:

use Aws\S3\Transfer;

$transfer = new Transfer($s3, $hlsDir, 's3://你的S3存储桶名称/远程存储路径/', [
    'before' => function ($source, $dest) {
        // 只上传HLS相关文件:.m3u8和.ts
        $ext = pathinfo($source, PATHINFO_EXTENSION);
        return in_array($ext, ['m3u8', 'ts']);
    }
]);

// 执行批量上传
$transfer->transfer();

内容的提问来源于stack exchange,提问作者Waqas Mani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:50:39