V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
estk
V2EX  ›  程序员

ffmpeg 无法下载 content-type 为 image 的 m3u8,有什么参数可以绕过并下载?

  •  
  •   estk · 2022-12-20 23:30:38 +08:00 · 2726 次点击
    这是一个创建于 698 天前的主题,其中的信息可能已经有所发展或是发生改变。
    起因:某个视频网站把切片以 image 文件的形式放别人图床上,运行 ffmpeg -i m3u8_url -c copy dl.mp4 无法下载,猜测是 ffmpeg 检测到 content-type 为 image 就不下载了

    m3u8 文件 URL Base64: aHR0cHM6Ly9jMi5tb25pZGFpLmNvbS8yMDIyMTEyOC9rTTlRakQwcS9pbmRleC5tM3U4
    curl m3u8_url 可以看到切片文件是.png 结尾

    但是在他们网页可以正常播放,网页 URL Base64: aHR0cHM6Ly9kaWFueWkubmcvcGFseS05VWpxQ1MtMS0xLmh0bWw=
    可能是 html video 标签不检测切片的 content-type 吧?

    发这个帖子的目的不是为了下载这个视频,想讨论一下 ffmpeg 遇到这种 m3u8 有什么什么参数可以让它顺利下载?
    15 条回复    2023-01-04 13:06:44 +08:00
    ysc3839
        1
    ysc3839  
       2022-12-21 00:20:46 +08:00 via Android
    改代码?
    icoming
        2
    icoming  
       2022-12-21 00:40:52 +08:00
    你访问那个图片 URL 看看,提示找不到。
    mikewang
        3
    mikewang  
       2022-12-21 00:59:53 +08:00   ❤️ 1
    链接已经失效了。换了一集试了下,这个视频站非常的狡猾,在 TS 片段前加上了 PNG 头部,迷惑图床,从而利用 CDN 的流量。
    显然 ffmpeg 是被骗了,无法解码;而 Chromium 没有被骗,所以浏览器可以正常播放。

    这个时候,需要手动下载 m3u8 的内容,然后向 FFmpeg 指定格式即可。

    wget https://....../../index.m3u8
    grep '.png' index.m3u8 | xargs curl > video.ts
    ffmpeg -f mpegts -i video.ts -codec copy video.mkv
    mikewang
        4
    mikewang  
       2022-12-21 01:06:42 +08:00
    estk
        5
    estk  
    OP
       2022-12-21 08:29:11 +08:00 via iPhone
    @mikewang #3
    所以只能手动下载所有切片,没有 ffmpeg 的其它参数可以让它忽略这个 content-type 直接下载?
    jiulang
        6
    jiulang  
       2022-12-21 09:10:06 +08:00
    反向代理来修改
    jifengg
        7
    jifengg  
       2022-12-21 10:00:19 +08:00   ❤️ 3
    我碰到过一些网站是这么搞的,但是,他不仅仅是只动了 content-type ,他文件存储的时候,就是在前面加了固定字节的 png 内容,所以 ffmpeg 去解码的时候会认为这是一个 png 图片。网页可以正常播放应该是内嵌的播放器做了处理。

    我以前写过一个下载的脚本,用的笨方法就是自己解析 m3u8 文件,下载里面的文件,截掉前面的 n 个字节,再用 ffmpeg 合并。
    Administrat0r
        8
    Administrat0r  
       2022-12-21 10:43:48 +08:00   ❤️ 2
    可以试试我蹭的这个项目 也是解决 png 的问题 https://github.com/orestonce/m3u8d
    novolunt
        9
    novolunt  
       2022-12-21 10:57:51 +08:00 via iPhone   ❤️ 1
    反向代理图床,改请求头。另外 视频存什么操作
    jeesk
        10
    jeesk  
       2022-12-21 21:24:36 +08:00
    简单的就是楼上的。否则直接去修改 ffmpeg 源码处理 reponse 的部分 。
    mikewang
        11
    mikewang  
       2022-12-22 01:26:06 +08:00
    @estk #5 不能,FFmpeg 对于 m3u8 要使用 HLS 这个 demuxer ,而内部 segment 的 demuxer 则是自动判断的,没有提供指定 demuxer 的方法。如果一定要使用 ffmpeg ,则需要修改源码重新编译了。
    Slurp
        12
    Slurp  
       2022-12-22 11:52:00 +08:00
    PR is welcome.
    estk
        13
    estk  
    OP
       2022-12-22 13:21:55 +08:00
    @Slurp #12
    官方会决绝说:如果用户传个.exe 是否也需要下载?
    Kobayashi
        14
    Kobayashi  
       2022-12-22 13:33:29 +08:00 via Android
    给个地址?
    AngryFootHair
        15
    AngryFootHair  
       2023-01-04 13:06:44 +08:00
    @mikewang @estk @jifengg

    刚刚试了下,123llq.com 123 浏览器 打开 网页 URL Base64: aHR0cHM6Ly9kaWFueWkubmcvcGFseS05VWpxQ1MtMS0xLmh0bWw= 这个页面,成功嗅探到了 m3u8 资源,点击就可以下载了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5611 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:56 · PVG 14:56 · LAX 22:56 · JFK 01:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.