python - 如何在 Python 中引用某个标准输出行?

标签 python ffmpeg ytdl

我正在尝试编写一个程序,该程序使用 yt-dlp 下载视频的一部分以获取流链接并使用 ffmpeg 下载视频。以下是该程序将执行的操作:

  • 向用户询问视频链接,然后将链接传递给 original_link变量
  • 询问用户开始时间和结束时间,然后将它们传递给 start_timeend_time分别。
  • 使用 subprocess ,调用shell命令yt-dlp --get-url <original_link> .
  • yt-dlp 将逐行输出链接。如果流来自 Twitch,则为 HLS,并且 yt-dlp 将仅返回一个链接(该链接将用于视频和音频输入)。如果流来自 Youtube 等服务,yt-dlp 将返回两个链接:一个音频流和一个视频流(将音频和视频流链接传递给值 video_streamaudio_stream )。
  • 然后,我们将调用另一个 subprocess下载文件的命令:
  • 如果 yt-dlp 只给出 1 个链接,则执行:(正如我之前提到的,这是将单个 HLS 流链接用于视频和音频输入的方式)


  • ffmpeg -ss <start_time> -to <end_time> -i <hls-stream-link> -ss <start_time> -to <end_time> -i <hls-stream-link> output.mkv
    
    * If yt-dlp gives 2 links (Youtube or video-on-demand), then call:
    
    ffmpeg -ss <start_time> -to <end_time> -i <video_stream> -ss <start_time> -to <end_time> -i <audio_stream> output.mkv
    
    我写了一个这样的示例程序:
    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-dlp 输出两个链接,那么我想让它们传递不同的值(一个用于视频,一个用于音频)。以下是一些示例链接供您使用:
  • https://www.youtube.com/watch?v=YS4e4q9oBaU
  • https://www.twitch.tv/videos/640057509

  • 感谢您的任何帮助!

    最佳答案

    使用 subprocess 读取 ffplay 输出的非常简单的示例.

    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)
    

    关于python - 如何在 Python 中引用某个标准输出行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71552296/

    相关文章:

    Python Telethon 获取组的所有管理员

    python - 没有地方部署Python Flask API项目

    python - 比较列表中元组的元素

    python - Numpy:填充共现矩阵的最快方法

    ffmpeg - ffmpeg 更改生成文件的比特率和文件大小

    audio - 如何使用ffmpeg在特定时间将音频添加到视频文件

    android - Android 上的 QMediaPlayer

    ffmpeg - Discord Music Bot 加入语音 channel ,亮绿色但没有任何音频。 2周前效果很好。控制台没有错误