使用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
相关产品推荐
相关产品推荐

