0
点赞
收藏
分享

微信扫一扫

脚本工具之下载M3U8文件类型的完整视频

沈芏 2022-04-19 阅读 70
linuxbash

脚本工具之下载M3U8文件类型的完整视频

在Linux系统,解决很多问题都是靠shell脚本就能快速解决。

通常,直接下载视频的链接地址只能得到一小部分视频文件(M3U8列表文件的第一个片段),今天我们写个脚本解决某视频平台的下载M3U8文件类型的完整版视频文件问题

文章目录

准备知识

M3U8是Unicode版本的M3U,用UTF-8编码。

那么,M3U又是什么呢?

M3U文件是一种纯文本文件,可以指定一个或多个多媒体文件的位置,其文件扩展名是“M3U”或者“m3u”。

M3U文件的作用通常是创建指向在线流媒体的播放列表,创建的文件可以轻松访问流媒体。M3U文件通常作为网站的下载资源。

正文-下载M3U8视频

今天以鹅厂里的一个视频为例介绍如何快速编写下载视频的脚本。

实验依赖环境:

  • Linux操作系统的Bash
  • you-get命令行下载工具

1.获取M3U8视频

打开Chrome或者Chromium等浏览器,随便找一个鹅厂视频点开,然后按F12打开开发者工具,之后在开发者工具里就找下图标记类型的链接,这个就是M3U8文件下载地址,鼠标右键,复制URL链接地址备用。

在这里插入图片描述

2.执行脚本工具下载视频

脚本工具文件名为m3u8_download.sh: 执行命令如下:

$ m3u8_download.sh https://xxxxxxxxxxxxxxx/gzc_1000102_dldkfldjfkfla.f321004.ts.m3u8?ver=4  out.mp4
...
下载地址: https://xxxxxxx/0381_gzc_1000102_0b53tqaayaaaeeaivo6vmfq4bhgdbsiqacca.f321004.13.ts?index=381&start=4482560&end=4496426&brs=77478936&bre=82758539&ver=4&token=1a37516957376f20acf946bb1d94650b
Site:       v.smtcdns.com
Title:      0381_gzc_1000102_0b53tqaayaaaeeaivo6vmfq4bhgdbsiqacca.f321004.13
Type:       MPEG-2 transport stream (video/MP2T)
Size:       5.04 MiB (5279604 Bytes)

Downloading 0381_gzc_1000102_0b53tqaayaaaeeaivo6vmfq4bhgdbsiqacca.f321004.13.ts ...
 100% (  5.0/  5.0MB) ├█████████████████████████████████████┤[1/1]   52 MB/s

real    13m4.497s
user    1m53.877s
sys     0m14.715s

这样,我们就用了13分钟时间完成下载视频任务了。成功得到了一个 out.mp4 视频文件。

最后

这里演示了一个脚本下载M3U8类型的视频文件方法,例子是固定的,但方法是活的。

例如你可以使用you-get,也可以使用wgetyoutube-dl等工具。

你当然可以并发同时下载多个文件, 比如一次下载50个文件(没有哪个厂家会认为这是合理的行为),适当控制,有代理池的话,你并发执行100个也是可以的。

当然,你有更好、更简单的方法可以给我留言,好方法一定要学会分享。

最后的最后,上脚本m3u8_download.sh文件的源码:

#!/usr/bin/env bash
# filename: m3u8_download.sh
# 功能: M3U8 下载视频脚本
# 依赖: curl + you-get

ua='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
dn_cmd="you-get -c $HOME/.cookies/qq.txt"

usage() {
    cat <<END

Usage:
    `basename $0`  <m3u8-url> <outfile>

Desc:

    m3u8-url :  M3U8 链接地址
    outfile  :  输出的视频文件名
END
}

download_m3u8_ts() {
    # 下载ts文件

    m3u8_url="$1"
    outfile="$2"

    if [ "$m3u8_url" = "" ] ; then
        echo "参数错误: 设置M3U8文件的URL地址"
        usage
        return 1
    fi

    if [ "$outfile" = "" ] ; then
        echo "参数错误: 设置输出文件名为空."
        usage
        return 2
    fi

    if [ -f "$outfile" ] ; then
        echo "输出文件[$outfile] 已经存在了,请先删除或换个名字."
        return 3
    fi
    
    m3u8_prefix=`dirname $m3u8_url`

    m3u8_file="./temp_m3u.list"
    curl -A "${ua}" $m3u8_url | awk '/^[0-9]/{ print $0 }'  > $m3u8_file
    for m3u8_suffix in `cat $m3u8_file`
    do
        dn_url="$m3u8_prefix/$m3u8_suffix"
        ts_file=`echo "$m3u8_suffix"| cut -d '?' -f1`
        echo "下载文件: $ts_file"
        $dn_cmd ${dn_url}
        if [ -f "$ts_file" ] ; then
            # 下载失败,再尝试一次
            sleep 1
            echo "下载文件(重试): $ts_file"
            $dn_cmd ${dn_url}
        fi
        # sleep 1
    done

    # 合并ts文件
    for m3u8_suffix in `cat $m3u8_file`
    do
        ts_file=`echo "$m3u8_suffix"| cut -d '?' -f1`
        cat $ts_file >> $outfile
    done
    
    rm -f $m3u8_file
}


time download_m3u8_ts $@

举报

相关推荐

0 条评论