鱼C论坛

 找回密码
 立即注册
查看: 344|回复: 10

[Python] 怎么把yt-dlp -o 1.srt 这种本地字幕文件 直接存入内存文件中?

[复制链接]
发表于 2024-6-5 15:38:20 | 显示全部楼层 |阅读模式
5鱼币
os.system(f'yt-dlp --write-subs --sub-langs 'en'  --skip-download -o 1.srt {video_link}')  这命令将把字幕写入本地文件1.srt里


怎么样把字幕内容直接写入 一个内存文件(用  io.StringIO ?)中呢?(就是越过先存到本地,再从本地读入到内存这一步)


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-5 16:15:40 | 显示全部楼层
我查了一下也是利用 subprocess 模块来捕获 yt-dlp 的输出。
import subprocess
import io

def get_subtitles(video_link):
    # 运行yt-dlp命令并捕获输出
    result = subprocess.run(
        ['yt-dlp', '--write-subs', '--sub-langs', 'en', '--skip-download', '-o', '-', video_link],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True
    )
    
    # 检查命令是否成功执行
    if result.returncode != 0:
        raise Exception(f"yt-dlp错误: {result.stderr}")
    
    # 创建一个内存文件对象
    subtitle_content = io.StringIO(result.stdout)
    
    return subtitle_content

video_link = 'https://www.bilibili.com/video/BV1c4411e77t/'  # 替换为你的Bilibili视频链接
subtitles = get_subtitles(video_link)

# 示例:如何使用字幕内容
print(subtitles.getvalue())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-6-5 17:05:36 | 显示全部楼层
小甲鱼的二师兄 发表于 2024-6-5 16:15
我查了一下也是利用 subprocess 模块来捕获 yt-dlp 的输出。

是空的,取不到。

python能在运行时模拟一个内存盘给临时文件用吗?  有没有这种模块呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-5 23:21:06 | 显示全部楼层
blackantt 发表于 2024-6-5 17:05
是空的,取不到。

python能在运行时模拟一个内存盘给临时文件用吗?  有没有这种模块呢?

确保提供的链接可以正确获取字幕文件哦,我 DEMO 中是随便填写的 URL。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-6-6 07:34:54 | 显示全部楼层
小甲鱼的二师兄 发表于 2024-6-5 23:21
确保提供的链接可以正确获取字幕文件哦,我 DEMO 中是随便填写的 URL。

subbug.png

确实是空的,并且会产生一个删不掉的本地文件  -.en-GB.vtt
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-25 10:34:44 | 显示全部楼层
在Python中,您可以使用`subprocess`模块与`io.StringIO`来捕获命令行工具的输出,从而避免将文件写入磁盘。以下是一个示例,演示如何使用`subprocess.Popen`与`io.StringIO`来捕获`yt-dlp`命令的输出并将其存储在内存中:

```python
import subprocess
import io

video_link = 'your_video_link_here'

# 创建一个StringIO对象作为子进程的stdin、stdout
output = io.StringIO()

# 使用subprocess.Popen运行yt-dlp命令,捕获输出
cmd = f'yt-dlp --write-subs --sub-langs en --skip-download -o - {video_link}'
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, text=True)
stdout, _ = process.communicate()

# 将yt-dlp命令的输出写入StringIO对象
output.write(stdout)

# 现在output对象包含了原本要写入磁盘的字幕内容
# 可以通过output.getvalue()获取内容
subtitle_content = output.getvalue()

# 打印或以其他方式使用字幕内容
print(subtitle_content)

# 使用完毕后,记得清理资源
output.close()
```
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-26 09:59:57 | 显示全部楼层
请问,为何要存在内存里?可否将原因讲一下,我们来看一下能不能用别的方法解决?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-8-26 19:07:48 | 显示全部楼层
zhangchenyvn 发表于 2024-8-26 09:59
请问,为何要存在内存里?可否将原因讲一下,我们来看一下能不能用别的方法解决?

字幕文件是临时过程文件,下一步的模块会从硬盘读入srt文件。

如果没有磁盘IO,直接从内存中读取,会不会稳定快一些呢。python为啥不能原生在内存中模拟一个带盘符的虚拟盘呢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-27 09:55:22 From FishC Mobile | 显示全部楼层
Python太上层了,这种操作可能要用C语言来处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-27 10:00:51 From FishC Mobile | 显示全部楼层
请将字幕文件encode,并且用io.BiteIO
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-27 10:02:53 From FishC Mobile | 显示全部楼层
from io import BytesIO
f = BytesIO()
f.write("str".encode('utf-8'))#写入的不是str,而是经过UTF-8编码的bytes
print(f.getvalue())
print(f.getvalue().decode("utf-8")) #解码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-8 08:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表