当前(2020年春节)正值疫情爆发期间,全国上下万众一心抗击新型冠状病毒。比较引人注目的一件事便是,央视推出了一个火神山和雷神山医院的建造直播,全国上下“云监工”达到近5000万(截止2020-01-30数据)。看到这个视频,我就想能不能将这个直播画面保存下来,最后将画面只间隔选取,做个长镜头的短视频,展现出武汉版的"小汤山”医院从无到的建造过程,想想应该很振奋人心。
首先获取直播流媒体的地址。然后编写一个脚本,自动从地址中下载当前时刻直播视频片段(ts文件格式),并保存到本地目录。再后,在系统中设置该脚本的自动执行的时间间隔,每隔一段时间就去抓一下视频。最后对抓取的视频片段,进行整理为短视频。
直播平台网址是https://m.yangshipin.cn/static/2020/c0126.html. 地址获取参考https://stackoverflow.com/questions/22188332/download-ts-files-from-video-stream.
最终我获得的网站是:
https://mobilelive-play.ysp.cctv.cn/ysp/9A7AA421CEB0886A30EC77031C6893C8BA69FD329B704F8485C4498BCB18D0A976A397AC2864A552B10CBB3D7FCB2EB15B28B5C966F9BF8A90A3A0D06F8283A8270DEA3E30AEA861DA7DA5B81DD258CB378E322826849FE5ACF1C50D9DE53424/2001891501_hd.m3u8?svrtime=1580313397&pid=600016618&cdn=5201&revoi=3C838DFA3FCF88B98661EE4397856546DB7D4CF4A3D8479119FCDC6A3B05B95ECF145CD6ED28C36E61E66363C2D64CEBC5740A34F6B3A6445A82247128154B8AD17728BBCA3C3665B6F9B781290428748A01DE8F9AC62E3253E550DCA8420E2CD268CC509C7709766553D9AC4D31C3701DCBAED8ADC3D051D1E989B105CF16AD33E743CDCDB4530FF9A017C2260FED1423FD480A7ADC2651
在上述寻找地址的地方其实有提到一个自动下载工具(m3u8x),但这里作为学习,还是采用编写python脚本的方式来实现。脚本如下
1 import requests 2 3 url='https://mobilelive-play.ysp.cctv.cn/ysp/9A7AA421CEB0886A30EC77031C6893C8BA69FD329B704F8485C4498BCB18D0A976A397AC2864A552B10CBB3D7FCB2EB15B28B5C966F9BF8A90A3A0D06F8283A8270DEA3E30AEA861DA7DA5B81DD258CB378E322826849FE5ACF1C50D9DE53424/2001891501_hd.m3u8?svrtime=1580313397&pid=600016618&cdn=5201&revoi=3C838DFA3FCF88B98661EE4397856546DB7D4CF4A3D8479119FCDC6A3B05B95ECF145CD6ED28C36E61E66363C2D64CEBC5740A34F6B3A6445A82247128154B8AD17728BBCA3C3665B6F9B781290428748A01DE8F9AC62E3253E550DCA8420E2CD268CC509C7709766553D9AC4D31C3701DCBAED8ADC3D051D1E989B105CF16AD33E743CDCDB4530FF9A017C2260FED1423FD480A7ADC2651' 4 headers = {"Connection": "keep-alive", 5 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36", 6 "Accept":"*/*" , 7 "Origin":"https://m.yangshipin.cn" , 8 "Sec-Fetch-Site":"cross-site" , 9 "Sec-Fetch-Mode":"cors" ,10 "Referer":"https://m.yangshipin.cn/static/2020/c0126.html?from=groupmessage&isappinstalled=0" ,11 "Accept-Encoding":"gzip, deflate, br" ,12 "Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8" ,13 "If-Modified-Since":"Thu, 30 Jan 2020 00:03:07 GMT" ,14 }15 16 r1 = requests.get(url, stream=True,headers= headers)17 18 fnames= r1.text.split('\n')[-6::2]19 print(fnames)20 21 import time22 23 def download_file(url):24 local_filename = url.split('/')[-1]25 # NOTE the stream=True parameter below26 with requests.get(url, stream=True) as r:27 r.raise_for_status()28 gt = time.gmtime(time.time())29 local_filename = '{:4d}{:02d}{:02d}-{:02d}{:02d}.ts'.format(gt.tm_year,gt.tm_mon, gt.tm_mday, gt.tm_hour, gt.tm_min)30 with open(local_filename, 'wb') as f:31 for chunk in r.iter_content(chunk_size=8192): 32 if chunk: # filter out keep-alive new chunks33 f.write(chunk)34 # f.flush()35 return local_filename36 37 download_file('https://mobilelive-play.ysp.cctv.cn/ysp/A197B7700944C6A8FE1F3A4384EC3DB3EFB4915F1ABA51A9E765C3E4D5492FB5CCC9754A5383AE916B1234F6AA8B37809E669A611CECF72538ED2981F211834C740EC82B9CCEA4A04F7DE249E9C5BA5DEA370A03B75EB4BD78C9ADBCC3788E16/'+fnames[-1])38
注意这里的头文件requests需要给一定header,否则网站认为你是程序访问的,不给你返回,头文件的信息可通过右击步骤一中的网站,copy as cUrl来得到。
本人机器上运行的为linux系统,采用cron来设置定时执行脚本比较方便,参考https://blog.csdn.net/katyusha1/article/details/78619549。
cron中的设置为
0-59/5 * * * * python ~/Downloads/a.py
.
ffmpeg是个优秀的视频处理命令行工具。处理过程中,视频抓取采用的是每5每种抓一次,只选视频片段的一帧,保存为图片,讲图片合成视频即可。 如下为处理的bash脚本。
1 i=12 for avi in `ls -rt 2020*.ts`3 do4 ffmpeg -i $avi -vframes 1 pics/$i.jpeg5 i=$((i+1))6 done7 ffmpeg -i pics/%d.jpeg aa.mp4
最终的视频结果如(到目前为止)
最终的视频结果如(到目前为止)
直播造医院,充分表达国人战胜疫情的决心,也展示了了不起的中国速度,为中国的土木人点赞。
江西星火网防科技有限公司工程案例
【萍乡安防监控安装咨询热线:15607994110 强弱电施工、信息光纤光缆熔接等服务,欢迎来电咨询。】