通过实际代码从视频流中下载以.TS或.m3u8文件路径为标识的内容视频,以便我可以制作Chrome扩展程序。

106
大多数网站上的视频都采用渐进式下载的方式,这意味着视频会被下载到我的电脑上,并且很容易被跟踪。有很多扩展程序可以做到这一点,甚至在开发工具中也很容易实现。
在某些网站上,视频是流式传输的,这意味着我们不仅下载一个文件,还下载了许多小包。在开发工具中,这些小包可以被跟踪到。我感兴趣的网站是:http://www.rtlxl.nl/#!/goede-tijden-slechte-tijden-10821/c8e2bff7-5a5c-45cb-be2b-4b3b3e866ffb
- 这些小包具有.TS扩展名。 - 通过复制请求的url,可以保存这些小包。 - 我无法播放这些文件。
我一定做错了什么或者我漏掉了什么。我想知道我做错了什么。我想创建一个用于个人使用的Chrome扩展程序,以捕获所有小包的URL。当我拥有所有URL时,我想将它们传递给一个PHP脚本,该脚本会下载它们并使用ffmpeg将它们粘贴到一个mp4文件中。
请指导我如何下载这些文件的内容。

1
如果您使用的是Linux系统,请查看此帖子https://gistpages.com/posts/download-streaming-video-ts-files。 - dina
3
Chrome/Firefox插件,一键下载流媒体视频。链接:https://www.downloadhelper.net/install - dina
有两件事需要记住:[1] 你可能需要使用AES密钥解密.ts文件,这可以通过简单的脚本完成。[2] 需要重新混流,否则在几秒钟内无法搜索并且由于某些部分而在结尾处损坏。这是困难的部分,需要使用ffmpeg。 - 林果皞
2
你可以使用hls-downloader Chrome扩展程序。 - dina
16个回答

59

在 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。


2
对我很有帮助。我还需要安装ffmpeg。作为Linux Debian用户,必须执行“apt-get install ffmpeg”。只是澄清一下,在第二个命令中,参数“format”的值(628)表示分辨率,应该从以前的列表中选择。 - Val Martinez
这太棒了!我想知道是否可以自动化以找到“最佳”? - Frank Fu
2
@frank-fu 只需省略 "format" 参数,youtube-dl 就会自动选择“最佳”格式,例如:youtube-dl https://bitdash-a.akamaihd.net/content/MI201109210084_1/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa.m3u8 - jaimet
因为在macOS上出现了以下错误,所以必须安装brew ffmpeg: ERROR: 检测到m3u8下载,但未找到ffmpeg或avconv。请安装其中一个。 - Faizan
完美运行。需要安装youtube-dl和ffmpeg brew install youtube-dl brew install ffmpeg 然后 youtube-dl "<url-to-m3u8-file>" 就像魔术一样,它将音频和视频文件合并在一起。 - undefined

54
除了 @aalhanane 和 @Micheal Espinola Jr 提到的方法外,m3u8x 只适用于 Windows 操作系统。一旦你确定了 m3u8 的 URL,你也可以使用 Jdownloader2 或 VLC Media Player 来下载和合并流。
Jdownloader2: 只需在 Jdownloader 打开时复制 m3u8 URL,它就会在 Linkgrabber 标签中识别出该流。
VLC 3: 打开网络 -> 粘贴 m3u8 URL -> 选中流输出 -> 选择设置。 选择输出文件、容器、视频和音频编码。 (例如:output.mp4,容器:mpeg4,视频:h264,音频:mp4a) 开始流传输。它不会播放视频,而是对其进行编码,并通过移动视频回放进度条显示编码进度。 警告:之前建议使用的 Chrome 扩展程序 Stream Video Downloader 包含恶意软件。请参见 reddit post

谢谢,使用 jDownloader2 程序下载了完整的视频,即使主机使用 Wowza Streaming Engine。 - Pastuh
我正在尝试从在线学习网站下载视频。我复制了m3u8文件,并尝试了所有方法,如VLC、youtube-dl、Jdownloader2等。仍然无法下载,但我可以流式播放。对于这个网站,我必须登录才能流式播放视频。即使是Internet Download Manager IDM也无法下载,显示“无法下载此受保护的流”。那么,有没有办法在不进行视频录制的情况下下载受保护/加密的流。请帮忙。 - IamVISH
2
请发布网站。如果您必须登录才能观看它,则该网站可以采取额外措施来保护内容,仅限已登录用户访问。上述方法将无法奏效。此外,还有像Widevine这样的DRM措施,确保只有您的浏览器获得适当的解密密钥,而不是任何其他程序。在这种情况下,唯一的方法是屏幕和音频输出捕获。 - dre-hh

33

---> 打开Firefox浏览器

---> 打开视频页面

---> 播放视频

点击 ---> 打开菜单

点击 ---> 打开Web开发者工具

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

点击 ---> 网络

---> 进入URL过滤器 ---> 输入"M3u8" --> 查找 "m3u8"

---> 复制URL ".m3u8"

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

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

---> 打开软件“m3u8x”

---> 粘贴URL "m3u8"

---> 选择选项"One...One"

---> 点击下载

---> 开始下载

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

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

一只忙碌的猫

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

一只忙碌的猫

图像“m3u8x” ===>

输入图像描述

输入图像描述


6
网络选项卡中没有.m3u8文件,只有.ts文件。 - Ariel
1
太棒了,但你没有提到在“粘贴URL”后面,你必须输入文件名,例如“video”,然后点击“质量”旁边的手图标,只有在这之后才能选择“一对一”和“下载”。至于其他方面,运行良好!谢谢。 - Developer
3
如果你只看到.ts文件,你需要刷新页面以获取.m3u8链接,这应该是第一个要加载的URL。 - Gabriel Fair

32

使用这篇文章所提供的方法:

  • 打开 Firefox / Chrome 浏览器

  • 打开视频所在的页面

  • 播放视频

  • 按下键盘上的F12 -> 网络(Network)

  • 筛选URL(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包装以查看哪个部分出错


2
非常好。但如果我像那样串联视频,结果并不是很好。当我用VLC观看时,在连接处有相当讨厌的视觉伪影。使用ffmpeg的“concat协议”得到的最佳结果。它也不完美,因为VLC在大步骤中前后移动时会遇到一些问题。 - user2373682
1
然而,对于所有视频来说,那个前进/后退的问题并不是一个难题。 - user2373682
这应该是被接受的答案,因为它实际上展示了幕后发生的事情(至少更多或更少,如果连接确实不太可靠),而不仅仅是指向一个已经完成的工具,而没有解释这个工具首先是如何工作的。 - Akito

22

虽然这个问题本不应该在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。


1
哦耶!像魔法一样! - Marcos Mendes
这是我的GIST中正在发生的更多情况 - https://gist.github.com/vrdriver/bf9746af1b1ca8a544826a2be87d33ae - vr_driver
如果您能解释一下命令行选项的作用,为什么需要它们或如何可能进行调整,那将会非常有帮助。 - Akito
您可以在 ffmpeg 文档中了解有关选项的信息。我找到了一个可行的示例。https://ffmpeg.org/ffmpeg.html - vr_driver
1
这是最好的答案。 - n8jadams
优雅致胜。 - Dave

14

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

12

我需要从一个具有会话保护内容的电子学习门户网站下载具有application/mp2t MIME内容类型的HLS视频和音频流。

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

但是,通过Video DownloadHelper Firefox扩展程序及其Companion App的帮助,任务变得更加容易。 它允许通过单击按钮下载包含TS块列表的m3u8播放列表以及实际的视频和音频流,并正确保留身份验证标头。

生成的不同视频和音频文件可以使用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扩展程序,但对我无效。


https://forum.videohelp.com/threads/370035-How-to-download-a-MP2T-stream 这篇文章还提到了livestreamer这个工具的替代品streamlink,但是它无法处理身份验证。 - Vadzim
1
2020 Vid Helper 7.3.9 和 FF 80,这个可以一键完成 :) - Tiana987642

9
  • 下载VLC播放器
  • 媒体
  • 转换/保存
  • 网络 (选项卡)
  • 输入[播放列表]的URL.m3u8
  • 按照向导中的步骤设置流媒体目标文件
  • 设置适当的转码配置文件(MP4)
  • 观看视频

8
许多网站将视频打包为多个传输流文件(.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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接