gpt4 book ai didi

php - 使用 Laravel 将 youtube-dl 输出流式传输到 S3

转载 作者:搜寻专家 更新时间:2023-10-31 21:47:39 24 4
gpt4 key购买 nike

背景:

我在 Laravel 5.3

我正在使用 youtube-dl 下载 YouTube 视频,使用 Symfony Process:

$command = '/usr/local/bin/youtube-dl -o '.$new_file_path.' '.$youtube_id;
$process = new Process($command);
$process->setTimeout(null);
$process->run();

Process 运行后,我将下载的文件放在预期位置。现在我可以将它存储到 S3,如下所示:

\Storage::disk('s3')->putFile($s3_location, new File($new_file_path));

问题

如您所见,我正在将文件下载到本地存储,然后上传到 S3。如果我能直接写到 S3 就太好了。特别是因为两个组件都支持流式传输——Process 类可以流式输出输出,而 S3 Storage 可以存储流,如下所示:

// Process class supports streamed output
// https://symfony.com/doc/current/components/process.html

// note the '-' after '-o' parameter - it asks youtube-dl to give a stream output, which can be piped in a shell
$process = new Process('/usr/local/bin/youtube-dl -o - '.$youtube_id;);
$process->start();

foreach ($process as $type => $data) {
if ($process::OUT === $type) {
echo "\nRead from stdout: ".$data;
} else { // $process::ERR === $type
echo "\nRead from stderr: ".$data;
}
}

还有,

// S3 Storage supports streams
// https://laravel.com/docs/5.3/filesystem#storing-files
Storage::put('file.jpg', $resource);

我的问题是 - 有没有办法将 Process 类的流式输出包装为 Resource/Stream 对象,并将其传递给 S3 存储?

最佳答案

更正:脚本实际上上传了所有可用的 block ,因为 file_get_contents 将继续到达 EOF

您需要确保有足够的可用内存,因为脚本不会处理可用内存的总大小与视频总大小的关系。

请注意我没有实际测试这个,因为我没有 s3 帐户,如果有任何问题请告诉我以更正答案。

// create ramdrive
// bash $ mkdir /mnt/ram_disk
// bash $ mount -t tmpfs -o size=1024m new_ram_disk /mnt/ram_disk

$array_of_youtube_ids = ['abc001', 'abc002' , 'abc003'];
$storage_path = '/mnt/ram_disk/';



// start all downloads
$index = 0;
foreach ($array_of_youtube_ids as $id){

$youtube_dls$index] = new YouTubeDlAsync($storage_path.$id, $id);
$youtube_dls[$index]->start();
$index ++;
}


// upload all downloads
$index = 0;
foreach ($array_of_youtube_ids as $id){

$s3uploads[$index] = new UploadToS3($storage_path.$id, $resource);
$s3uploads[$index]->start();

$index ++;
}

// Wait for all downloads to finish
foreach ($youtube_dls as $youtube_dl)
$youtube_dl->join();

// Wait for all uploads to finish
foreach ($s3uploads as $s3upload)
$s3upload->join();

class YouTubeDlAsync extends Thread {

public function __construct($new_file_path, $youtube_id) {
$command = '/usr/local/bin/youtube-dl -o '.$new_file_path.' '.$youtube_id;
exec($command);
}
}

class UploadToS3 extends Thread {

public function __construct($new_file_path, $resource) {
Storage::put(file_get_contents('file.jpg'), $resource);
}
}

关于php - 使用 Laravel 将 youtube-dl 输出流式传输到 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54366889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com