从视频流中下载 TS 文件 [关闭]

Posted

技术标签:

【中文标题】从视频流中下载 TS 文件 [关闭]【英文标题】:Download TS files from video stream [closed] 【发布时间】: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。 【参考方案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。

【讨论】:

嗬嗬!就像一个魅力! 这里有更多来自我的 GIST 的内容 - gist.github.com/vrdriver/bf9746af1b1ca8a544826a2be87d33ae【参考方案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 文件中,同时正确保留身份验证标头。

生成的单独视频和音频文件可以是merged 和ffmpeg:

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,但对我不起作用。

【讨论】:

forum.videohelp.com/threads/… 还提到了livestreamer 替代方案,它最近被分叉为streamlink,但它不处理身份验证。 2020 vid helper 7.3.9。和 ff 80 和这工作一键 :)【参考方案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)。

【讨论】:

以上是关于从视频流中下载 TS 文件 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

下载.ts分段视频,m3u8视频文件下载

Python3 根据m3u8下载视频,批量下载ts文件并且合并

关于ts是啥文件?

python 爬虫下载视频 并 安装使用 ffmpeg 合并ts视频文件 使用16进制 修改文件头类型

如何从 M3U8 文件下载视频 [关闭]

批量下载ts视频文件