当前(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 time 22 23 def download_file(url): 24 local_filename = url.split(‘/‘)[-1] 25 # NOTE the stream=True parameter below 26 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 chunks 33 f.write(chunk) 34 # f.flush() 35 return local_filename 36 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=1 2 for avi in `ls -rt 2020*.ts` 3 do 4 ffmpeg -i $avi -vframes 1 pics/$i.jpeg 5 i=$((i+1)) 6 done 7 ffmpeg -i pics/%d.jpeg aa.mp4
最终的视频结果如(到目前为止)
Sorry, your browser doesn‘t support embedded videos.
与技术无关
直播造医院,充分表达面对疫情国人的决心,也展示了了不起的中国速度,为中国的土木人点赞。
原文地址:https://www.cnblogs.com/zwlwf/p/12243074.html