【问题标题】:Download TS files from video stream [closed]从视频流中下载 TS 文件 [关闭]
【发布时间】:2014-04-06 22:55:01
【问题描述】:

大多数网站上的视频都使用渐进式下载,这意味着视频会下载到我的计算机上,并且易于追踪。有很多扩展可以做到这一点,即使在开发工具中也很容易做到。

在某些网站上流式传输视频。这意味着我们不只是下载一个文件,我们下载了很多小包。在开发工具中可以跟踪这些包。我感兴趣的网站是:http://www.rtlxl.nl/#!/goede-tijden-slechte-tijden-10821/c8e2bff7-5a5c-45cb-be2b-4b3b3e866ffb

-这些包具有 .TS 扩展名。

-可以通过复制请求的url来保存包

-我无法播放这些文件。

我一定是做错了什么,或者我遗漏了什么。我想知道我做错了什么。我想创建一个供个人使用的 chrome 扩展,它捕获所有包的 url。当我拥有所有 url 时,我想将它们传递给 php 脚本,该脚本下载它们并使用 ffmpeg 将它们粘贴到 mp4 文件中。

请帮我拿包。

【问题讨论】:

  • 如果你在 linux 上看这篇文章gistpages.com/posts/download-streaming-video-ts-files
  • downloadhelper.net/installchrome/firefox插件,一键下载流媒体视频
  • 有两件事要记住: [1] 您可能需要使用 AES 密钥解密 .ts 文件,这仍然可以通过简单的脚本来完成。 [2] 需要remuxing,否则会因为某些部分而在几秒钟内无法搜索并最终损坏。这是困难的部分,需要 ffmpeg。

标签: video stream ffmpeg download package


【解决方案1】:

就像这两个命令一样简单:

wgethttps://example.com/videos/tschunks_{0..10}.ts

cat tschunks_{0..10}.ts > video.mp4

*- "https://example.com/videos/tschunks_{0..10}"-部分可以在 m3u8 文件中找到

【讨论】:

    【解决方案2】:

    许多网站将其视频打包为多个传输流文件 (.ts)。如果您想输出完整长度的视频,您需要下载所有 .ts 文件片段并组装它们。使用 FFmpeg 命令行工具可以轻松完成组装。

    如果有人正在寻找从视频流中下载 TS 文件的 Java 方式,这里有一个很好的实用示例和文章,其中还详细介绍了 TS 和 M3U8 文件的工作原理 >> https://jet-cabral.medium.com/java-ts-video-downloader-a0fcf23ab84a

    下载所有 .ts 文件后,ffmpeg 命令用于组装/连接视频如下所示:

    ffmpeg -i "concat:C:\users\your-name\file_0.ts|C:\users\your-name\file_1.ts|C:\users\your-name\file_2.ts|C:\users\your-name\file_3.ts
    

    如果您已经知道包含要下载的 .ts 文件的 .m3u8 文件的 url。然后以下命令下载所有 .ts 文件并输出单个 .mp4 文件

    ffmpeg -i "http://www.some-website.com/video/someM3U8_file.m3u8" -c copy -bsf:a aac_adtstoasc "full_video.mp4"
    

    【讨论】:

      【解决方案3】:

      除了@aalhanane 和 @Micheal Espinola Jr

      因为 m3u8x 仅适用于 Windows。 一旦您确定了 m3u8 url,您还可以使用 Jdownloader2 或 VLC Media Player 下载并连接流。

      Jdownloader2: 只需在 Jdownloader 打开时复制 m3u8 url。它将识别 Linkgrabber 选项卡中的流。

      VLC 3:

      打开网络 -> 粘贴 m3u8 url -> 勾选 Streamoutput -> 选择设置。 选择输出文件、容器、视频和音频编码。 (例如 output.mp4,容器:mpeg4,视频:h264,音频:mp4a) 启动流。它不会播放视频,而是对其进行编码,通过移动视频播放进度条来显示编码进度。

      警告:之前建议的 chrome 扩展 Stream Video Downloader 包含恶意软件。见reddit post

      【讨论】:

      • 谢谢,用 jDownloader2 程序下载了完整的视频,甚至主机使用了 Wowza 流引擎
      • 我正在尝试从电子学习网站下载视频。我处理了 m3u8 文件并尝试了 VLC、youtube-dl、Jdownloader2 等所有方法。仍然无法下载,但我可以流式传输。对于这个站点,我必须登录才能流式传输视频。甚至 Internet 下载管理器 IDM 也无法下载说“无法下载此受保护的流”。那么,无论如何我可以在不录制视频的情况下下载受保护/加密的流。请帮忙。
      • 请张贴网站。如果您必须登录才能观看,该网站可以采取额外措施来保护仅登录用户的内容。那么上面的方法就行不通了。还有像widevine这样的DRM措施可以确保只有您的浏览器获得正确的解密密钥,而不是任何其他程序。在这种情况下,唯一的方法是屏幕和音频输出捕获
      【解决方案4】:
      • 下载 VLC 播放器
      • 媒体
      • 转换/保存
      • 网络(标签)
      • 输入 [播放列表].m3u8 的 URL
      • 按照剩余的向导步骤设置流目标(文件)
      • 设置适当的转码配置文件(本回答时为 MP4)
      • 观看视频

      【讨论】:

        【解决方案5】:

        虽然这不应该被问到 SO 并且首先通过了审查程序,但我不知道......但无论如何我都会给出我的答案。

        在探索了这里提供的所有选项之后,事实证明最简单的往往是最好的。

        首先从https://evermeet.cx/ffmpeg/下载ffmpeg

        接下来,在获得 .m3u8 播放列表文件(很可能来自网页源或网络流量)后,运行以下命令:

        ffmpeg -i "http://host/folder/file.m3u8" -bsf:a aac_adtstoasc -vcodec copy -c copy -crf 50 file.mp4
        

        我尝试从本地保存的 m4u8 文件运行它,但没有成功,因为 ffmpeg 下载过程会下载与 URL 相关的块,因此请确保使用网站 url。

        【讨论】:

        【解决方案6】:

        我想出了一个高效的并行化一行,它使用GNU Parallel 将一系列.ts 文件连接成一个.mp4 文件:

         parallel -k curl https://example.com/video/seg-{}-f4-v1-a1.ts ::: {1..279} >> result.mp4
        

        关键是用{} 替换你的url 的变体部分,并用下限和上限设置{a..b}。就是这样!

        【讨论】:

          【解决方案7】:

          您可以为此使用 Xtreme 下载管理器 (XDM) 软件。该软件可以从任何网站以这种格式下载。 甚至这个软件也可以改变ts文件格式。下载时只需要更改格式即可。

          点赞:https://www.videohelp.com/software/Xtreme-Download-Manager-

          【讨论】:

            【解决方案8】:
            • 从开发者工具的“网络”选项卡中获取一个链接
            • 从链接中删除索引和 ts 扩展

            使用以下脚本,您可以将电影保存到视频文件夹

            示例用法:

            download-video.sh https://url.com/video.mp4 video-name
            

            下载-video.sh

            #!/bin/bash
            LINK=$1
            NAME=$2
            
            START=0
            END=2000
            
            help()
            {
                echo "download-video.sh <url> <output-name>"
                echo "<url>: x.mp4 (without .ts)"
                echo "<output-name>: x (without .mp4)"
            } 
            
            create_folders()
            {
                # create folder for streaming media
                cd ~/Videos
                mkdir download-videos
                cd download-videos
            }
            
            print_variables()
            {
                echo "Execute Download with following parameters"
                echo "Link $LINK"
                echo "Name $NAME"
            }
            
            check_video()
            {
                i=$START
                while [[ $i -le $END ]]
                do
                    URL=$LINK'-'$i.ts
                    STATUS_CODE=$(curl -o /dev/null --silent --head --write-out '%{http_code}\n' $URL)
                    if [ "$STATUS_CODE" == "200" ]; then
                        break
                    fi
                    ((i = i + 1))
                done
            
                if [ "$STATUS_CODE" == "200" ]; then
                    START=$i
                    echo "START is $START"
                else 
                    echo "File not found"
                fi
            } 
            
            
            download_video()
            {
                i=$START
                e=$END
                while [[ $i -le $END ]]
                do
                    URL=$LINK'-'$i.ts
                    STATUS_CODE=$(curl -o /dev/null --silent --head --write-out '%{http_code}\n' $URL)
                    if [ "$STATUS_CODE" != "200" ]; then
                        break
                    fi
                    wget $URL
                    e=$i
                    ((i = i + 1))
                done
            
                END=$e
            }
            
            concat_videos()
            {
                DIR="${LINK##*/}"
            
                i=$START
                echo "i is $i"
                while [[ $i -le $END ]]
                do
                    FILE=$DIR'-'$i.ts
                    echo $FILE | tr " " "\n" >> tslist
                    ((i = i + 1))
                done
                while read line; 
                do 
                    echo "gugu"$line
                    cat $line >> $NAME.mp4; 
                done < tslist
            
                rm *.ts tslist
            }
            
            if [ "$1" == "" ]; then
                echo "No video url provided"
                help
            else
                LINK=$1
                if [ "$2" == "" ]; then
                    echo "No video output-name provided"
                    help
                else
                    NAME=$2
                    create_folders
                    print_variables
                    check_video
                    download_video
                    concat_videos
                fi
            fi
            

            【讨论】:

            • 脚本运行良好,但并非总是如此,某些站点设置了一些限制。如果我运行 wget $URL,我得到 403。如果尝试从 chrome 下载它可以工作。看起来一个网站做了一些验证谁以及如何访问了文件......
            【解决方案9】:

            macOS 上的简单 youtube-dl 示例(在命令行终端中;也支持 Windows):

            # List variants (resolutions/bitrates)
            $ youtube-dl -F https://bitdash-a.akamaihd.net/content/MI201109210084_1/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa.m3u8
            [generic] f08e80da-bf1d-4e3d-8899-f0f6155f6efa: Requesting header
            [generic] f08e80da-bf1d-4e3d-8899-f0f6155f6efa: Downloading m3u8 information
            [info] Available formats for f08e80da-bf1d-4e3d-8899-f0f6155f6efa:
            format code           extension  resolution note
            audio-English_stereo  mp4        audio only [en] 
            628                   mp4        320x180     628k , avc1.42c00d, video only
            928                   mp4        480x270     928k , avc1.42c00d, video only
            1728                  mp4        640x360    1728k , avc1.42c00d, video only
            2528                  mp4        960x540    2528k , avc1.42c00d, video only
            4928                  mp4        1280x720   4928k , avc1.42c00d, video only
            9728                  mp4        1920x1080  9728k , avc1.42c00d, video only (best)
            
            # Choose a variant to download, and use its format code below
            $ youtube-dl --format 628 https://bitdash-a.akamaihd.net/content/MI201109210084_1/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa.m3u8
            ...
            frame= 5257 fps=193 q=-1.0 Lsize=    6746kB time=00:03:30.16 bitrate= 263.0kbits/s speed=7.73x    
            video:6679kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.998669%
            [ffmpeg] Downloaded 6907810 bytes
            [download] 100% of 6.59MiB in 00:29
            
            $ open f08e80da-bf1d-4e3d-8899-f0f6155f6efa-f08e80da-bf1d-4e3d-8899-f0f6155f6efa.mp4
            

            在开始流式视频时,使用浏览器的开发者工具 > 网络获取 m3u8(HLS 清单)URL。

            【讨论】:

            • 为我工作。我还必须安装ffmpeg。作为 linux debian 用户必须执行“apt-get install ffmpeg” 只是一个澄清。在第二条命令中,paramenter--format, (628) 的值表示分辨率,应该从前面的列表中选择
            • 这太棒了!我想知道这是否可以自动找到“最佳”?
            • @frank-fu 只需省略“格式”参数,youtube-dl 会自动选择“最佳”即youtube-dl https://bitdash-a.akamaihd.net/content/MI201109210084_1/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa.m3u8
            【解决方案10】:

            1) 请阅读@aalhanane 的说明(在“粘贴 URL m3u8”步骤后,您必须输入文件名称,例如“视频”,然后单击“质量”旁边的“手”图标,然后才应该选择“一对一”和“下载”)。

            2)流分视频和音频,所以需要单独下载,然后用同一个m3u8x加入https://youtu.be/he-tDNiVl2M(可选转换成mp4)。

            3) m3u8x 可以毫无问题地下载视频,但在我的情况下,它无法提取音频链接。所以我只是下载了 *.m3u8 文件并搜索包含 GROUP-ID="audio-0" 的行,然后向右滚动并复制链接(!包括令牌!)并将其直接粘贴到 m3u8x 的“质量 URL”字段中应用程序。然后像视频流一样“一对一”下载。

            一旦我拥有视频和音频,我就加入并成功 =)

            附言如果以后自动提取停止工作,您可以使用相同的方法手动提取视频链接。

            【讨论】:

              【解决方案11】:

              使用this 发帖

              • 打开火狐/chrome

              • 打开视频页面

              • 播放视频

              • 点击键盘上的F12 -> network

              • Filter URLsts

              • 复制ts的链接

              • 从链接中删除索引和 ts 扩展

                例如:

                http://vid.com/vod/mp4:vod/PRV/Yg0WGN_6.mp4/media_b180000_454.ts
                

                将被复制为

                 http://vid.com/vod/mp4:vod/PRV/Yg0WGN_6.mp4/media_b180000
                

              LINK下面的脚本中插入

              #!/bin/bash
              
              # insert here urls
              LINK=(
              
              'http://vid.com/vod/mp4:vod/PRV/Yg0WGN_6.mp4/media_b180000' # replace this with your url 
              
              )
              
              mkdir my-videos
              cd mkdir my-videos
              
              CNT=0
              
              for URL in ${LINK[@]}
              do
                # create folder for streaming media
                CNT=$((CNT + 1))
                mkdir $CNT
                cd $CNT
              
                (
              
                 DIR="${URL##*/}"
              
                 # download all videos
                 wget $URL'_'{0..1200}.ts
              
                 # link videos
                 echo $DIR'_'{0..1200}.ts | tr " " "\n" > tslist
                 while read line; do cat $line >> $CNT.mp4; done < tslist
              
                 rm -rf media* tslist
                 ) &
                 cd ..
              
              done
              
              wait
              

              编辑

              在 python 中添加脚本 - 在 windows 和 linux 上运行

              import urllib.request
              import os
              import shutil
              
              my_lessons = [
                 #  http://vid.com/vod/mp4:vod/PRV/Yg0WGN_6.mp4/media_b180000_454.ts
                  "http://vid.com/vod/mp4:vod/PRV/Yg0WGN_6.mp4/media_b180000" # replace this with your url 
              
              
              ]
              
              lesson_dir = "my_vids"
              try:
                  shutil.rmtree(lesson_dir)
              except:
                  print "ok"
              
              os.makedirs(lesson_dir)
              os.chdir(lesson_dir)
              
              for lesson, dwn_link in enumerate(my_lessons):
                  print ("downloading lesson  %d.. " % (lesson), dwn_link)
                  file_name = '%04d.mp4' % lesson
                  f = open(file_name, 'ab')
                  for x in range(0, 1200):
                      try:
                          rsp = urllib.request.urlopen(dwn_link + "_%04d.ts" % (x) )
                      except:
                          break
                      file_name = '%d.mp4' % lesson
                      print "downloading  %d.ts" % (x)
                      f.write(rsp.read())
                  f.close()
              
              
              
              print "done good luck!! ==================  "
              

              如果脚本失败,或下载空文件,请尝试删除 try wrap 以查看失败原因

              【讨论】:

              • 非常好。如果我这样连接,结果对我的视频来说不是很好。当我用 VLC 观看时,在路口有相当烦人的视觉伪影。我使用 ffmpeg“concat 协议”得到的最好结果。它也不完美,因为 VLC 在大步向前和向后移动时遇到了一些麻烦。
              • ...不过,前进/后退对所有视频来说都不是问题。
              【解决方案12】:

              我需要从电子学习门户下载 HLS 视频和音频流,其中包含application/mp2t MIME 内容类型的会话保护内容。

              手动将所有身份验证标头复制到下载脚本中太麻烦了。

              但是在Video DownloadHelper Firefox 扩展的帮助下,任务变得容易多了,它是Companion App。 它允许通过单击按钮将带有 TS 块列表的 m3u8 播放列表以及实际的视频和音频流下载到 mp4 文件中,同时正确保留身份验证标头。

              生成的单独视频和音频文件可以是mergedffmpeg

              ffmpeg -i video.mp4 -i audio.mp4 -acodec copy -vcodec copy video-and-audio.mp4 
              

              mp4box:

              mp4box -add audio.mp4#audio video.mp4 -out video-and-audio.mp4
              

              也试过Video DownloadHelper Chrome extension,但对我不起作用。

              【讨论】:

              【解决方案13】:

              我对迪娜的回答做了一些更改,以避免尝试下载/组合 1200 个部分(如果没有那么多)。

              我还发现在 chrome 的网络选项卡中按 waterfall 排序很有帮助。这将按文件下载时间排序,因此当您流式传输视频时,最近下载的部分将位于顶部,便于查找.ts 链接。

              #!/bin/bash
              
              # Name of the containing folder
              GROUP="My Videos"
              
              # Example link: https://vids.net/ABCAED/AADDCDE/m3u8/AADDCDE/AADDCDE_0.ts
              # Insert below as: https://vids.net/ABCAED/AADDCDE/m3u8/AADDCDE/AADDCDE
              
              # INSERT LINKS TO VIDEOS HERE
              LINK=(
              'Title for the video link'
              'https://vids.net/ABCAED/AADDCDE/m3u8/AADDCDE/AADDCDE'
              'Title for the next video'
              'https://vids.net/EECEADFE/EECEADFE/m3u8/EECEADFE/EECEADFE'
              )
              
              # ------------------------------------------------------------------------------
              mkdir "$GROUP"
              cd "$GROUP"
              
              I=0
              while [ $I -lt ${#LINK[@]} ]
              do
                # create folder for streaming media
                TITLE=${LINK[$I]}
                mkdir "$TITLE"
                cd "$TITLE"
                mkdir 'parts'
                cd 'parts'
              
                J=$((I + 1))
                URL=${LINK[$J]}
              
                I=$((I + 2))
              
                DIR="${URL##*/}"
              
                # download all streaming media parts
                VID=-1
                while [ $? -eq 0 ];
                do
                  VID=$((VID + 1))
                  wget $URL'_'$VID.ts
                done
              
                # combine parts
                COUNTER=0
                while [  $COUNTER -lt $VID ]; do
                  echo $DIR'_'$COUNTER.ts | tr " " "\n" >> tslist
                  let COUNTER=COUNTER+1
                done
                while read line; do cat $line >> $TITLE.ts; done < tslist
              
                rm -rf tslist
                mv "$TITLE.ts" "../$TITLE.ts"
              
                cd ..
                rm -rf 'parts'
                cd ..
              
              done
              

              【讨论】:

                【解决方案14】:

                --->打开火狐

                --->打开视频页面

                ---> 播放视频

                点击--->打开菜单

                点击--->打开网页开发者工具

                点击--->开发者工具栏

                点击--->网络

                ---> 转到过滤 URL ---> 写“M3u8” --> 查找“m3u8”

                --->复制网址“.m3u8”

                ==========================

                现在下载软件“m3u8x”---->https://tajaribsoft-en.blogspot.com/2016/06/m3u8x.html#downloadx12

                --->打开软件“m3u8x”

                ---> 粘贴 URL “m3u8”

                ---> 选择选项“一个...一个”

                --->点击下载

                --->开始下载

                ==========================

                图片“打开菜单”===>

                图片“开发者工具栏”===>

                图像“m3u8x”===>

                【讨论】:

                • 网络标签中没有.m3u8文件,只有.ts文件。
                • 这太棒了,但你没有提到在“粘贴 URL“m3u8”之后你必须输入文件的名称,例如“视频”,然后点击“质量”旁边的手形图标,然后只有在那之后,您才能选择“一对一”和“下载”。至于其余的,效果很好!谢谢
                • 如果只看到 .ts 文件,则需要刷新页面以获取 .m3u8 链接,该链接应该是第一个加载的 url
                【解决方案15】:

                将其中一个 .ts 视频文件复制并粘贴到 Chrome 的新标签中。删除 .ts 文件的标识号(0、1、2、3 等或任何数字)并将扩展名从“.ts”更改为“.mp4”。这应该像往常一样在您的浏览器中显示视频文件。

                【讨论】:

                  【解决方案16】:

                  您需要下载所有传输流 (.ts) 文件,并将它们连接成一个 mpeg 以供播放。诸如此类的传输流具有关联的播放列表文件 (.m3u8),其中列出了您需要下载和连接的所有 .ts 文件。如果可用,可能会有一个辅助 .m3u8 播放列表,它将单独列出字幕 Steam 文件 (.vtt)。

                  【讨论】:

                    猜你喜欢
                    • 2018-06-06
                    • 2015-07-04
                    • 2012-12-06
                    • 2013-12-04
                    • 2011-01-30
                    • 2019-08-10
                    • 2016-09-10
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多