首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何引用Python中的某个标准输出行?

如何引用Python中的某个标准输出行?
EN

Stack Overflow用户
提问于 2022-03-21 02:44:37
回答 1查看 176关注 0票数 0

我正在编写一个程序,下载视频的一部分,使用yt获取流链接,ffmpeg下载视频。下面是这个项目的作用:

respectively.

  • Using

  • 要求用户提供视频链接,然后将链接传递给original_link变量

  • ,询问用户的开始时间和结束时间,然后将这些传递给start_timeend_time

  • subprocess,调用shell命令yt-dlp --get-url <original_link>.

  • yt-dlp将逐行输出链路。如果流来自Twitch,则为HLS,yt将只返回一个链接(该链接将用于视频和音频输入)。如果流来自Youtube等服务,yt-dlp将返回两个链接:一个音频流和一个视频流(将音频和视频流链接传递给值audio_stream).

  • Then,和video_stream ),我们将调用另一个subprocess命令来下载文件:如果yt-dlp只提供1链接,则执行:(正如我前面提到的,这是用于视频和音频input)

的单个HLS流链接)。

代码语言:javascript
运行
复制
ffmpeg -ss <start_time> -to <end_time> -i <hls-stream-link> -ss <start_time> -to <end_time> -i <hls-stream-link> output.mkv
代码语言:javascript
运行
复制
* If yt-dlp gives 2 links (Youtube or video-on-demand), then call:
代码语言:javascript
运行
复制
ffmpeg -ss <start_time> -to <end_time> -i <video_stream> -ss <start_time> -to <end_time> -i <audio_stream> output.mkv

我写了一个这样的示例程序:

代码语言:javascript
运行
复制
import subprocess

# Input video link
original_link = input("Enter the link of the video: ")

# Input start and end time
start_time = input("Enter video start time: ")
end_time = input("Enter video end time: ")

# Get raw url
stream_link = subprocess.Popen(["yt-dlp", "--get-url", original_link], stdout=subprocess.PIPE)

while True:
    line = stream_link.stdout.readline()
    if not line:
        break
    


# subprocess.Popen(["ffmpeg", "-ss", start_time, "-to", end_time, "-i"], stdout=subprocess.PIPE)

但是,我仍然不知道如何引用子进程标准输出中的某些行。例如,如果yt输出两个链接,那么我希望让它们以单独的值传递(一个用于视频,另一个用于音频)。下面是一些供您使用的示例链接:

  1. https://www.youtube.com/watch?v=YS4e4q9oBaU
  2. https://www.twitch.tv/videos/640057509

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2022-03-21 10:53:48

一个非常简单的用subprocess读取ffplay输出的例子。

代码语言:javascript
运行
复制
from subprocess import Popen, PIPE, STDOUT

comm_line = ['ffplay','-hide_banner','-autoexit','-i','My.mp4']

try:
    play = Popen(comm_line, stdout=PIPE, stderr=STDOUT, universal_newlines=True)
except Exception as e:
    print("ffplay", str(e))

play_pid = play.pid

with play.stdout:
    for i in iter(play.stdout.readline, b''):
        if i != '':
            pass
        else:
            break
        print(i)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71552296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档