shell脚本分析cctv 央视 shtml 获取 m3u8链接,每天自动下载2k超清版本《新闻联播》以便未能按时收看时学习跟进

需求:用脚本每天快速自动下载央视CCTV新闻联播,存为MP4文件,以便未能按时收看时学习跟进。

思路:

  1. 验证可行性,尝试在Windows下使用辅助下载软件走通下载。
  2. 再分析相关链接,查找 m3u8 数据源
  3. 用shell 脚本解决自动化的问题,samba 共享出来供NAS播放。
  4. 尝试用脚本实现批量下载过往一段时间(比如最近一个月)的视频。

1.验证可行性:

首先央视在这里每天会自动更新当天的新闻联播完整版:
https://tv.cctv.com/lm/xwlb/index.shtmlhttps://tv.cctv.com/lm/xwlb/index.shtmlshell 下 fetch 这个index.html 分析后,grep awk 一通 可得:

​
fetch https://tv.cctv.com/lm/xwlb/index.shtml && cat index.shtml | grep alt= | grep href | grep shtml | awk -F href= '{print $2}' | awk '{print $1}' | head -1
fetch: http://tv.cctv.com/lm/xwlb/index.shtml: size of remote file is not known
index.shtml 31 kB 112 MBps 00s
"https://tv.cctv.com/2022/10/09/VIDErRXFLeCOeS5Q03mANHiQ221009.shtml"

​

"https://tv.cctv.com/2022/10/09/VIDErRXFLeCOeS5Q03mANHiQ221009.shtml" 

使用Windows 下的《央视视频下载器(China Red Commemorative Edition)》 软件,

https://www.jb51.net/softs/809665.html

可以直接下载得到1200码率的视频。

《新闻联播》_20221009_2100.mp4.

​ 

 2.查找数据源

浏览器F12分析

https://tv.cctv.com/2022/10/09/VIDErRXFLeCOeS5Q03mANHiQ221009.shtml

解析得到 m3u8 位置在这里:

https://dh5.cntv.kcdnvip.com/asp/h5e/hls/main/0303000a/3/default/a0de2bcfaef048078be234f03bf020cc/main.m3u8?maxbr=2048&contentid=15120519184043

其中第一个 main.m3u8 是main.m3u8顶流适配(多码率适配)
第二个和第3\4 都是二级适配(单码率适配)
m3u8顶流适配的作用是跳转其他m3u8的地址,用来请求不同分辨率的ts文件
可以分析得到四个不同码率的流,分别是 2000、1200、850、450,分别对应超清、高清、标清和流畅画质。

已知

https://dh5.cntv.kcdnvip.com/asp/h5e/hls/main/0303000a/3/default/a0de2bcfaef048078be234f03bf020cc/main.m3u8?maxbr=2048&contentid=15120519184043

加密的,如果直接下载会得到一个花屏画面的mp4,但也搜索找到了解决方案,就是:两个改动

1. 把域名中的dh5改为hls,
2. 链接中的h5e/ 去除

就可以得到不加密的的m3u8地址为:

https://dh5.cntv.myhwcdn.cn/asp/h5e/hls/main/0303000a/3/default/1995d2c63d574f41970d059945ee573a/main.m3u8?maxbr=2048&contentid=15120519184043

盘它:

ffmpeg -i "https://dh5.cntv.myhwcdn.cn/asp/h5e/hls/main/0303000a/3/default/1995d2c63d574f41970d059945ee573a/main.m3u8?maxbr=2048&contentid=15120519184043" -c copy -bsf:a aac_adtstoasc xwlbc.mp4

但是盘 main.m3u8 只能获得默认的 1200 分辨率版本。

frame=45033 fps=3259 q=-1.0 Lsize=  257820kB time=00:30:01.31 bitrate=1172.5kbits/s speed= 130x    
video:249929kB audio:6460kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.558038%

 这个好办,直接改盘2000.m3u8就可以下载2000超清版本:

ffmpeg -i "https://hls.cntv.myhwcdn.cn/asp/hls/2000/0303000a/3/default/a0de2bcfaef048078be234f03bf020cc/2000.m3u8" -c copy -bsf:a aac_adtstoasc xwlb2k.mp4

frame=44997 fps=365 q=-1.0 Lsize=  436935kB time=00:29:59.89 bitrate=1988.7kbits/s speed=14.6x    
video:407958kB audio:27547kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.328248%

试了一些不同月份的,有点规律:

https://hls.cntv.myhwcdn.cn/asp/hls/2000/0303000a/3/default/94dfb8525c114ee3966d6f2364d7e78c/2000.m3u8

https://hls.cntv.kcdnvip.com/asp/hls/2000/0303000a/3/default/f7b2addd35094c648c70303f320ad161/2000.m3u8

https://hls.cntv.myhwcdn.cn/asp/hls/2000/0303000a/3/default/12e91d9fa3dc4baabb3099c7709c74e8/2000.m3u8

https://hls.cntv.myalicdn.com/asp/hls/2000/0303000a/3/default/f355b524fa464c7a829948ef090b3ed0/2000.m3u8

  • 域名有多个可以用, 比如myhwcdn.cn 和  kcdnvip.com、myalicdn.com
  • a0de2bcfaef048078be234f03bf020cc 这段会变化,可以在

https://tv.cctv.com/2022/10/09/VIDErRXFLeCOeS5Q03mANHiQ221009.shtml

 找到 对应的guid, guid=a0de2bcfaef048078be234f03bf020cc

其它固定直接拼出来就行了。

3. 自动化

下载最新一期的新闻联播:

cctvxwlb# cat /data/script/get_cctv_xwlb.sh
#!/bin/sh
mp4dir="/ftp/temp/cctvxwlb"
#自动下载当天新闻联播
#如果时间是新闻联播之前,则下载的是昨天的版本
#所以脚本会安排在当天的凌晨或者下午20点以后比较合适
hours=`date +%H`
echo hours %hours
if [ $hours -lt 20 ]
        then date=`date -v -1d +%Y%m%d`
else
        date=`date -v -0d +%Y%m%d`
fi

echo date $date
#下载https://tv.cctv.com/lm/xwlb/index.shtml

fetch https://tv.cctv.com/lm/xwlb/index.shtml -o /tmp

#分析index.shtml 找到VIDEVHzsa1SIW28YuoxFPFjP220809

vid=`cat /tmp/index.shtml | grep alt= | grep href | grep shtml | awk -F href= '{print $2}' | awk '{print $1}' | head -1 | tr -d \"`
echo vid $vid;
vidfile=`echo $vid | awk -F "/" '{print $NF}'`
echo vid file is: $vidfile ;

#下载vid file
fetch $vid -o /tmp
#分析 vidfile $vid  找到 guid 和 title

guids=`cat /tmp/$vidfile | grep guid | awk -F "=" '{print $2}' | head -1 | tr -d ";| |\"|'^M'" `
`uid=`echo $guids | tr -d 
echo guid: $guid
title=`cat /tmp/$vidfile | grep title | head -1 | awk -F "<|>" '{print $3'} | awk '{print $1$2}'`
echo output title: $date.$title.mp4

#拼接 https://hls.cntv.myhwcdn.cn/asp/hls/2000/0303000a/3/default/94dfb8525c114ee3966d6f2364d7e78c/2000.m3u8
#域名有多个可以用, 比如myhwcdn.cn 和 kcdnvip.com
myhwcdn="myhwcdn.cn"
kcdnvip="kcdnvip.com"
#alicdn 只能提供1200 码率的版本,删除 myalicdn="myalicdn.com"

m3u8myhwcdn="https://hls.cntv.${myhwcdn}/asp/hls/2000/0303000a/3/default/${guid}/2000.m3u8"
echo myhwcdn m3u8 file: $m3u8myhwcdn

m3u8kcdnvip="https://hls.cntv.${kcdnvip}/asp/hls/2000/0303000a/3/default/${guid}/2000.m3u8"
echo kcdnvip m3u8 file: $m3u8kcdnvip

#m3u8myalicdn="https://hls.cntv.${myalicdn}/asp/hls/2000/0303000a/3/default/${guid}/2000.m3u8"
#echo myalicdn m3u8 file: $m3u8myalicdn

        if [ `expr $date  % 2` -eq 0 ];then
                echo oushu
                /usr/local/bin/ffmpeg -i "$m3u8myhwcdn" -c copy -bsf:a aac_adtstoasc $mp4dir/$date.$title.myhwcdn.1280x720p.mp4
        else
                echo jishu
                /usr/local/bin/ffmpeg -i "$m3u8kcdnvip" -c copy -bsf:a aac_adtstoasc $mp4dir/$date.$title.kcdnvip.1280x720p.mp4
        fi

chmod 664 $mp4dir/*.mp4
rm /tmp/index.shtml /tmp/VID*.shtml

4. 下载指定日期的新闻联播:

cctvxwlb# cat /data/script/get_cctv_xwlb_by_date.sh 
#!/bin/sh
#判断第一个参数,如果没输入,则提示参数格式        
if [ -z $1 ];                                      
        then echo "Missing Date";
        echo "Usage: $0 Date";                 
        echo " Example: $0 20221009";
else                                               
#如果有参数,就开始查找指定日期的新闻联播
#https://tv.cctv.com/lm/xwlb/day/20221003.shtml

        echo "...OK, Let's go!"
        echo "Inputed DateCode $1"
date=`date -v -1d +%Y%m%d`
date=$1
echo date $date

mp4dir="/ftp/temp/cctvxwlb"

#https://tv.cctv.com/lm/xwlb/day/20221003.shtml
dayurl=https://tv.cctv.com/lm/xwlb/day/$date.shtml
echo $dayurl
fetch $dayurl -o /tmp

#分析$dayurl 找到VIDEVHzsa1SIW28YuoxFPFjP220809

vid=`cat /tmp/$date.shtml | grep alt= | grep href | grep shtml | awk -F href= '{print $2}' | awk '{print $1}' | head -1 | tr -d \"`
echo vid $vid;
vidfile=`echo $vid | awk -F "/" '{print $NF}'`
echo vid file is: $vidfile ;

#下载vid file
fetch $vid -o /tmp
#分析 vidfile $vid  找到 guid 和 title

guids=`cat /tmp/$vidfile | grep guid | awk -F "=" '{print $2}' | head -1 | tr -d ";| |\"|'^M'" `
`uid=`echo $guids | tr -d 
echo guid: $guid
title=`cat /tmp/$vidfile | grep title | head -1 | awk -F "<|>" '{print $3'} | awk '{print $1$2}'`
echo output title: $date.$title.mp4

#拼接 https://hls.cntv.myhwcdn.cn/asp/hls/2000/0303000a/3/default/94dfb8525c114ee3966d6f2364d7e78c/2000.m3u8
#域名有多个可以用, 比如myhwcdn.cn 和 kcdnvip.com
myhwcdn="myhwcdn.cn"
kcdnvip="kcdnvip.com"
myalicdn="myalicdn.com"                                 
                                                        
m3u8myhwcdn="https://hls.cntv.${myhwcdn}/asp/hls/2000/0303000a/3/default/${guid}/2000.m3u8"
echo myhwcdn m3u8 file: $m3u8myhwcdn

m3u8kcdnvip="https://hls.cntv.${kcdnvip}/asp/hls/2000/0303000a/3/default/${guid}/2000.m3u8"
echo kcdnvip m3u8 file: $m3u8kcdnvip

m3u8myalicdn="https://hls.cntv.${myalicdn}/asp/hls/2000/0303000a/3/default/${guid}/2000.m3u8"
echo myalicdn m3u8 file: $m3u8myalicdn                  

        if [ `expr $date  % 3` -eq 0 ];then             
                echo 0/3                                
                /usr/local/bin/ffmpeg -i "$m3u8myhwcdn" -c copy -bsf:a aac_adtstoasc $mp4dir/$date.$title.myhwcdn.1920x1080p.mp4 
        elif [ `expr $date  % 3` -eq 1 ];then
                echo 1/3
                /usr/local/bin/ffmpeg -i "$m3u8kcdnvip" -c copy -bsf:a aac_adtstoasc $mp4dir/$date.$title.kcdnvip.1920x1080p.mp4   
        else
                echo 2/3
                /usr/local/bin/ffmpeg -i "$m3u8myalicdn" -c copy -bsf:a aac_adtstoasc $mp4dir/$date.$title.myalicdn.1920x1080p.mp4 
        fi

chmod 664 $mp4dir/*.mp4
rm /tmp/$date.shtml /tmp/VID*.shtml
fi;

5.批量下载

某几天内的新闻联播:

cctvxwlb# cat /data/script/get_cctv_xwlb_ndays.sh 
#!/bin/sh   
for i in $(seq 0803 0810)
do 
date=`echo 20220$(expr $i \* 1)`;
/data/script/get_cctv_xwlb_by_date.sh $date
echo $date Done;
done

效果图:

展示一下成果如下图所示:

鸣谢:

感谢lucida@CCF 在代码分析阶段提供的解题思路。

### 回答1: ffmpeg是一款功能强大的多媒体处理工具,它支持各种音视频格式的转换和处理。要实现自动下载m3u8视频并合并为ts格式,可以使用ffmpeg的命令行工具和一些脚本编程。 首先,需要编写一个脚本或程序来自动从指定的m3u8链接下载视频文件。可以使用编程语言(如Python)来实现这个脚本,使用HTTP请求库来获取m3u8文件的内容,并解析出各个ts分片的链接。 接下来,可以使用ffmpeg的命令行工具,利用解析到的ts分片链接下载每个分片,并同将它们合并为一个完整的ts视频文件。以下是示例的ffmpeg命令: ffmpeg -i "url_to_ts1" -c copy -bsf:a aac_adtstoasc output.ts 上述命令中,"url_to_ts1"表示第一个ts分片的链接,可以根据实际情况替换为对应的分片链接。"-c copy"表示复制原始编码格式,"-bsf:a aac_adtstoasc"用于修复aac音频流中的格式问题。"output.ts"表示最终生成的合并后的ts文件。 要实现自动下载并合并多个ts分片,可以在脚本中使用循环来依次下载每个分片,并调用ffmpeg命令行工具来合并这些分片。 需要注意的是,m3u8文件通常是分段加载的,因此可能需要等待所有分片下载完成才能合并为完整的视频文件。可以在脚本中增加相应的等待间或轮询机制,确保所有分片都已下载完成后再调用ffmpeg进行合并操作。 总之,通过编写脚本或程序,结合ffmpeg命令行工具,可以实现自动下载m3u8视频并合并为ts格式的功能。 ### 回答2: ffmpeg是一个开源的音视频处理工具,它可以用来处理各种格式的音视频文件。m3u8是一种常见的音视频流媒体播放列表格式,通常用于将一个音视频文件分割成多个小的ts文件,并通过HTTP协议进行传输和播放。 要使用ffmpeg自动下载m3u8并合并为ts文件,可以按照以下步骤进行操作: 1. 下载ffmpeg并安装到本地计算机上。 2. 在命令行中输入以下命令来下载m3u8文件: ```shell ffmpeg -i URL_OF_M3U8_FILE -c copy OUTPUT_FILENAME.ts ``` 其中,`URL_OF_M3U8_FILE`是m3u8文件的URL地址,`OUTPUT_FILENAME`是输出的ts文件名。 命令中的`-c copy`选项表示直接复制视频和音频流而不进行重新编码,以提高处理速度。 3. 执行命令后,ffmpeg将会自动下载m3u8文件,并将其合并为一个ts文件。合并过程可能需要一些间,取决于m3u8文件的大小和网络状况。 4. 执行完成后,即可在当前目录下找到合并后的ts文件。 需要注意的是,以上命令仅适用于能够公开访问的m3u8文件。若m3u8文件需要身份验证或具有访问控制,请先确保具备合法的使用权限。 总之,使用ffmpeg自动下载m3u8并合并为ts文件,是一种便捷的处理方式,适用于需要分析或修改m3u8文件的情况。 ### 回答3: FFmpeg是一种强大的开源多媒体处理工具,它可以用于从网络上自动下载M3U8视频流,并将其合并为TS格式。M3U8是一种常用的流媒体播放列表文件格式,常用于存储视频的分段URL链接。 要使用FFmpeg自动下载并合并M3U8为TS,我们可以使用以下命令行操作: 1. 首先,我们需要安装FFmpeg工具,并将其添加到系统路径中。 2. 然后,在命令行中输入以下命令: ``` ffmpeg -i [M3U8链接] -c copy -bsf:a aac_adtstoasc output.ts ``` 在此命令中,我们需要将[M3U8链接]替换为实际的M3U8文件的URL链接。该命令使用`-i`参数指定输入M3U8文件,`-c copy`参数用于复制视频和音频流,以保持原始质量,`-bsf:a aac_adtstoasc`参数用于处理AAC音频流的编码问题,`output.ts`为输出的合并后的TS文件名称。 3. 输入命令后,FFmpeg将自动开始下载M3U8文件并合并为TS格式。下载进度将在命令行中显示。 4. 下载完成后,我们将在当前目录中找到生成的TS文件,这是M3U8下载和合并的结果。 总结起来,FFmpeg利用其强大的功能,可以方便地自动下载并合并M3U8视频流为TS格式。这在处理流媒体和视频下载方面非常有用,为用户提供了一种方便快捷的方法来获取他们所需的视频内容。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值