鱼C论坛

 找回密码
 立即注册
查看: 68|回复: 7

怎么把yt-dlp --write-subs --sub-langs 'en' 的字幕不保存而直接存入内存文件中

[复制链接]
发表于 2024-6-5 14:50:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
怎么把  yt-dlp --write-subs --sub-langs 'en' --convert-subs srt --skip-download 下载的字幕 不保存到本地,而是送入内存文件中呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-5 14:51:24 | 显示全部楼层
要将yt-dlp下载的字幕直接保存到内存文件中,可以使用Python的io模块来实现。下面是一个示例代码:
import io
import subprocess

# 创建一个BytesIO对象,用于保存字幕数据
subs_buffer = io.BytesIO()

# 使用subprocess模块运行yt-dlp命令,并将输出的字幕数据重定向到subs_buffer
subprocess.run(['yt-dlp', '--write-subs', '--sub-langs', 'en'], stdout=subs_buffer, check=True)

# 获取字幕数据并进行处理
subs_data = subs_buffer.getvalue()
# 在这里可以对字幕数据进行进一步处理,比如解析、提取等

# 将字幕数据写入文件(可选)
with open('subtitle.srt', 'wb') as f:
    f.write(subs_data)

# 打印字幕数据(可选)
print(subs_data.decode('utf-8'))

同样的,如果你想在下载字幕的同时转换为SRT格式,并将其保存到内存文件中,可以稍作修改:
import io
import subprocess

# 创建一个BytesIO对象,用于保存字幕数据
subs_buffer = io.BytesIO()

# 使用subprocess模块运行yt-dlp命令,并将输出的字幕数据重定向到subs_buffer
subprocess.run(['yt-dlp', '--write-subs', '--sub-langs', 'en', '--convert-subs', 'srt', '--skip-download'], stdout=subs_buffer, check=True)

# 获取字幕数据并进行处理
subs_data = subs_buffer.getvalue()
# 在这里可以对字幕数据进行进一步处理,比如解析、提取等

# 将字幕数据写入文件(可选)
with open('subtitle.srt', 'wb') as f:
    f.write(subs_data)

# 打印字幕数据(可选)
print(subs_data.decode('utf-8'))

这样,你就可以将yt-dlp下载的字幕保存到内存文件中,并对数据进行进一步处理或显示。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 15:11:33 | 显示全部楼层
FishC 发表于 2024-6-5 14:51
要将yt-dlp下载的字幕直接保存到内存文件中,可以使用Python的io模块来实现。下面是一个示例代码:

  File "c:\Users\dengz\Downloads\filmot\t1.py", line 15, in <module>
    subprocess.run(['yt-dlp', '--write-subs', '--sub-langs', 'en', '--convert-subs', 'srt', '--skip-download', 'https://www.youtube.com/watch?v=FypmEWNN-XI'], stdout=subs_buffer, check=True)
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2544.0_x64__qbz5n2kfra8p0\Lib\subprocess.py", line 548, in run
    with Popen(*popenargs, **kwargs) as process:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2544.0_x64__qbz5n2kfra8p0\Lib\subprocess.py", line 992, in __init__
    errread, errwrite) = self._get_handles(stdin, stdout, stderr)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.11_3.11.2544.0_x64__qbz5n2kfra8p0\Lib\subprocess.py", line 1384, in _get_handles
    c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
                                    ^^^^^^^^^^^^^^^
io.UnsupportedOperation: fileno
PS C:\Users\dengz\Downloads\filmot>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-5 15:11:48 | 显示全部楼层
blackantt 发表于 2024-06-05 15:11
File "c:\Users\dengz\Downloads\filmot\t1.py", line ...


抱歉,我在提供的代码中出现了一些问题。原因是subprocess无法直接将输出重定向到io.BytesIO对象,因为该对象没有fileno()方法。

解决这个问题的一种方法是使用Popen来手动处理子进程的输出。下面是修改后的代码:
import io
import subprocess

# 创建一个BytesIO对象,用于保存字幕数据
subs_buffer = io.BytesIO()

# 运行yt-dlp命令并捕获子进程的输出
process = subprocess.Popen(['yt-dlp', '--write-subs', '--sub-langs', 'en'],
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE)
output, error = process.communicate()

# 将输出的字幕数据写入subs_buffer
subs_buffer.write(output)

# 获取字幕数据并进行处理
subs_data = subs_buffer.getvalue()
# 在这里可以对字幕数据进行进一步处理,比如解析、提取等

# 将字幕数据写入文件(可选)
with open('subtitle.srt', 'wb') as f:
    f.write(subs_data)

# 打印字幕数据(可选)
print(subs_data.decode('utf-8'))

请注意,你需要将`['yt-dlp', '--write-subs', '--sub-langs', 'en']`替换为适当的yt-dlp命令及参数。

希望这次能解决你的问题!如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 15:18:45 | 显示全部楼层
FishC 发表于 2024-6-5 15:11
抱歉,我在提供的代码中出现了一些问题。原因是subprocess无法直接将输出重定向到io.BytesIO对象,因为 ...

需要把字幕内容送入内存文件,不是把命令的屏显送入内存文件啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-5 15:19:03 | 显示全部楼层
blackantt 发表于 2024-06-05 15:18
需要把字幕内容送入内存文件,不是把命令的屏显送入内 ...


非常抱歉理解错误。如果你想要将yt-dlp下载的字幕内容直接保存到内存文件中,可以使用`subprocess.Popen`来运行yt-dlp命令并捕获其输出。然后,将输出的字幕内容写入到内存文件中。下面是一个修改后的示例代码:
import subprocess
import io

# 运行yt-dlp命令并捕获子进程的输出
process = subprocess.Popen(['yt-dlp', '--write-subs', '--sub-langs', 'en'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = process.communicate()

# 将字幕内容写入内存文件
subs_buffer = io.BytesIO(output)

# 获取字幕数据并进行处理
subs_data = subs_buffer.getvalue()
# 在这里可以对字幕数据进行进一步处理,比如解析、提取等

# 打印字幕数据(可选)
print(subs_data.decode('utf-8'))

请确保你已经安装了yt-dlp,并将`['yt-dlp', '--write-subs', '--sub-langs', 'en']`替换为适当的yt-dlp命令及参数。

这样,字幕内容就会被保存到内存文件中,你可以随后对其进行处理。

希望这次能够满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 15:22:59 | 显示全部楼层
FishC 发表于 2024-6-5 15:19
非常抱歉理解错误。如果你想要将yt-dlp下载的字幕内容直接保存到内存文件中,可以使用`subprocess.Pope ...

这还是屏显啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-5 15:23:20 | 显示全部楼层


非常抱歉,我之前的回答仍然存在误解。由于yt-dlp没有提供直接将字幕内容输出到内存文件的选项,我们需要对yt-dlp的输出进行一些处理。请尝试以下代码:
import subprocess
import io

# 运行yt-dlp命令并捕获子进程的输出
process = subprocess.Popen(["yt-dlp", "--write-subs", "--sub-langs", "en", "--skip-download", "--convert-subs", "srt", "视频链接"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, error = process.communicate()

# 查找并提取字幕内容
subs_start = output.find(b'WEBVTT')  # 根据具体输出格式进行调整
if subs_start != -1:
    subs_start += len('WEBVTT') + 1  # 跳过"WEBVTT"和换行符
    subs_data = output[subs_start:]
else:
    print("未找到字幕内容")

# 将字幕数据写入内存文件
subs_buffer = io.BytesIO(subs_data)

# 在这里可以对字幕数据进行进一步处理,比如解析、提取等

# 打印字幕数据(可选)
print(subs_data.decode('utf-8'))

请注意,你需要将`"视频链接"`替换为你要下载字幕的视频链接。

这样,你可以通过修改程序来适应不同的字幕输出格式,并将字幕内容保存到内存文件中进行进一步处理。

希望这次能够满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-22 04:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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