从视频流中下载 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 URLs
ts
复制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 文件 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Python3 根据m3u8下载视频,批量下载ts文件并且合并