【问题标题】:Recording youtube live stream to file in python将 youtube 直播流录制到 python 中的文件
【发布时间】:2019-09-02 00:55:41
【问题描述】:

我想录制 youtube 直播并使用 python 将其保存到文件中。

我尝试使用 pytube 库,但它可能适用于视频,而不适用于直播。

我想录制流并将其保存到视频格式为 avi 或类似的文件。

【问题讨论】:

    标签: python youtube pytube


    【解决方案1】:

    根据@wownis 的回答进行修改。
    (我试过这个答案,但是它不起作用。)

    # pip install urllib
    # pip install m3u8
    # pip install streamlink
    import urllib
    import m3u8
    import streamlink
    
    
    def get_stream(url):
        """
        Get upload chunk url
        """
        streams = streamlink.streams(url)
        stream_url = streams["best"]
    
        m3u8_obj = m3u8.load(stream_url.args['url'])
        return m3u8_obj.segments[0]
    
    
    def dl_stream(url, filename, chunks):
        """
        Download each chunks
        """
        pre_time_stamp = 0
        for i in range(chunks+1):
            stream_segment = get_stream(url)
            cur_time_stamp = \
                stream_segment.program_date_time.strftime("%Y%m%d-%H%M%S")
    
            if pre_time_stamp == cur_time_stamp:
                pass
            else:
                print(cur_time_stamp)
                file = open(filename + '_' + str(cur_time_stamp) + '.ts', 'ab+')
                with urllib.request.urlopen(stream_segment.uri) as response:
                    html = response.read()
                    file.write(html)
                pre_time_stamp = cur_time_stamp
    
    
    url = "https://www.youtube.com/watch?v=2U3JnFbD-es"
    dl_stream(url, "live", 15)
    

    输出如下:

    ./
    live_20200713-103739.ts   
    live_20200713-103744.ts   
    ...
    

    【讨论】:

      【解决方案2】:

      我找到了一个解决方案,并将我的代码放在 python 中:

      导入urllib
      导入 m3u8
      导入流链接
      
      
      def 记录流(网址,文件名,迭代):
          最后一部分 = 0
          对于我在范围内(迭代+1):
      
              流 = streamlink.streams(url)
              stream_url = 流[“最佳”]
              打印(stream_url.args['url'])
      
              m3u8_obj = m3u8.load(stream_url.args['url'])
      
              previous_part_time = last_part
              last_part = m3u8_obj.segments[-1].program_date_time
      
              如果我 >= 1:
               对于范围内的 j(1,len(m3u8_obj.segments)):
                  如果 m3u8_obj.segments[-j].program_date_time == previous_part_time:
                     休息
      
               打印(j)
      
               文件=打开(文件名+“.ts”,“ab+”)
               对于范围内的 i (j-1,0,-1):
                  以 urllib.request.urlopen(m3u8_obj.segments[-i].uri) 作为响应:
                     html = response.read()
                     文件.write(html)
      
      
      url = "https://www.youtube.com/watch?v=BgKGctL0u1U"
      record_stream(url,"file",10)

      10 表示 10 次迭代,如果块有 2s,则表示记录 20s 的流

      【讨论】:

        猜你喜欢
        • 2021-06-11
        • 2016-05-10
        • 2014-11-03
        • 2018-07-16
        • 2016-08-28
        • 2020-01-15
        • 2017-09-21
        • 2015-01-11
        • 1970-01-01
        相关资源
        最近更新 更多