飞道的博客

年轻人不讲武德,竟用Python让马老师表演闪电五连鞭!

330人阅读  评论(0)

11月份的头条,是属于马保国的。

一位69岁的老同志,惨遭年轻人偷袭,不讲武德。

看看把老同志欺负的...

要不是马老师讲仁义讲道德,甩手就是一个五连鞭。

哈哈哈,所以本期我们就用Python给马保国老师做一个闪电五连鞭动态词云图

词云数据来自B站,使用stylecloud词云库绘制。

主要参考百度AI Studio上的一个开源项目,使用PaddleSeg对人像进行分割。

年轻人不讲武德这样好吗耗子尾汁


很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1156465813

 

/ 01 / 弹幕数据获取

没从B站上直接爬取,使用第三方库bilibili_api

这是一个用Python写的调用Bilibili各种API的库,范围涵盖视频、音频、直播、动态、专栏、用户、番剧等。

地址:https://passkou.com/bilibili_api/docs/

使用video模块下面的两个方法,可以获取11月每天的视频弹幕。

首先需要获取SESSDATACSRF(bili_jct)的值。

谷歌浏览器可以通过下图查看,域名选择bilibili.com。

以点击量为排序,选取排行第一的视频获取弹幕。没想到马老师老早就火了,耗子尾汁。

点击排名第一的视频,然后在浏览器的访问栏获取BV号,BV1HJ411L7DP。

获取弹幕代码如下。


  
  1. from bilibili_api import video, Verify
  2. import datetime
  3. # 参数
  4. verify = Verify( "你的SESSDATA值", "你的bili_jct值")
  5. # 获取存在历史弹幕的日期列表
  6. days = video.get_history_danmaku_index(bvid= "BV1HJ411L7DP", verify=verify)
  7. print(days)
  8. # 获取弹幕信息,并保存
  9. for day in days:
  10. danmus = video.get_danmaku(bvid= "BV1HJ411L7DP", verify=verify, date=datetime.date(*map(int, day.split( '-'))))
  11. print(danmus)
  12. f = open( r'danmu.txt', 'a')
  13. for danmu in danmus:
  14. print(danmu)
  15. f.write(danmu.text + '\n')
  16. f.close()

得到结果。

我大E了啊,没有闪。

使用jieba对弹幕数据进行分词处理


  
  1. import jieba
  2. def get_text_content(text_file_path):
  3. '''
  4. 获取填充文本内容
  5. '''
  6. text_content = ''
  7. with open(text_file_path, encoding= 'utf-8') as file:
  8. text_content = file.read()
  9. # 数据清洗,只保存字符串中的中文,字母,数字
  10. text_content_find = re.findall( '[\u4e00-\u9fa5a-zA-Z0-9]+', text_content, re.S)
  11. text_content = ' '.join(jieba.cut(str(text_content_find).replace( " ", ""), cut_all= False))
  12. print(text_content)
  13. return text_content
  14. text_content = get_text_content( 'danmu.txt')

选取马保国原版素材视频,B站上有高清的。

地址:https://www.bilibili.com/video/BV1JV41117hq

参考网上的资料,运行如下代码即可下载B站视频


  
  1. from bilibili_api import video, Verify
  2. import requests
  3. import urllib3
  4. # 参数
  5. verify = Verify( "你的SESSDATA值", "你的bili_jct值")
  6. # 获取下载地址
  7. download_url = video.get_download_url(bvid= "BV1JV41117hq", verify=verify)
  8. print(download_url[ "dash"][ "video"][ 0][ 'baseUrl'])
  9. baseurl = 'https://www.bilibili.com/video/BV1JV41117hq'
  10. title = '马保国'
  11. def get_video():
  12. urllib3.disable_warnings()
  13. headers = {
  14. 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
  15. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
  16. 'Accept-Encoding': 'gzip, deflate, br',
  17. 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'
  18. }
  19. headers.update({ 'Referer': baseurl})
  20. res = requests.Session()
  21. begin = 0
  22. end = 1024 * 1024 - 1
  23. flag = 0
  24. temp = download_url
  25. filename = "./" + title + ".flv"
  26. url = temp[ "dash"][ "video"][ 0][ 'baseUrl']
  27. while True:
  28. headers.update({ 'Range': 'bytes=' + str(begin) + '-' + str(end)})
  29. res = requests.get(url=url, headers=headers, verify= False)
  30. if res.status_code != 416:
  31. begin = end + 1
  32. end = end + 1024 * 1024
  33. else:
  34. headers.update({ 'Range': str(end + 1) + '-'})
  35. res = requests.get(url=url, headers=headers, verify= False)
  36. flag = 1
  37. with open(filename, 'ab') as fp:
  38. fp.write(res.content)
  39. fp.flush()
  40. if flag == 1:
  41. fp.close()
  42. break
  43. print( '--------------------------------------------')
  44. print( '视频下载完成')
  45. filename = "./" + title + ".mp3"
  46. url = temp[ "dash"][ "audio"][ 0][ 'baseUrl']
  47. while True:
  48. headers.update({ 'Range': 'bytes=' + str(begin) + '-' + str(end)})
  49. res = requests.get(url=url, headers=headers, verify= False)
  50. if res.status_code != 416:
  51. begin = end + 1
  52. end = end + 1024 * 1024
  53. else:
  54. headers.update({ 'Range': str(end + 1) + '-'})
  55. res = requests.get(url=url, headers=headers, verify= False)
  56. flag = 1
  57. with open(filename, 'ab') as fp:
  58. fp.write(res.content)
  59. fp.flush()
  60. if flag == 1:
  61. fp.close()
  62. break
  63. print( '音频下载完成')

记得添加SESSDATA和CSRF(bili_jct)的值

 

/ 02 / PaddleSeg人像分割

基于百度AI Studio的项目,项目地址:

https://aistudio.baidu.com/aistudio/projectdetail/1176398

首先下载解压安装PaddleSeg相关依赖包。


  
  1. # 下载PaddleSeg
  2. git clone https://hub.fastgit.org/PaddlePaddle/PaddleSeg.git
  3. cd PaddleSeg/
  4. # 安装所需依赖项
  5. pip install -r requirements.txt

通常去「GitHub」上下载东西,速度都比较慢,可以使用加速链接。

这里的fastgit.org一加,下载速度就能从几十K飙升到几兆每秒。


  
  1. # 新建文件夹
  2. mkdir work/videos
  3. mkdir work/texts
  4. mkdir work/mp4_img
  5. mkdir work/mp4_img_mask
  6. mkdir work/mp4_img_analysis

新建一些文件夹,主要用来存放相关文件的。

这里可以将之前爬取到的视频和音频放置在videos中。

先对素材视频进行抽帧,就是获取视频每帧的图片。


  
  1. def transform_video_to_image(video_file_path, img_path):
  2. '''
  3. 将视频中每一帧保存成图片
  4. '''
  5. video_capture = cv2.VideoCapture(video_file_path)
  6. fps = video_capture.get(cv2.CAP_PROP_FPS)
  7. count = 0
  8. while ( True):
  9. ret, frame = video_capture.read()
  10. if ret:
  11. cv2.imwrite(img_path + '%d.jpg' % count, frame)
  12. count += 1
  13. else:
  14. break
  15. video_capture.release()
  16. filename_list = os.listdir(img_path)
  17. with open(os.path.join(img_path, 'img_list.txt'), 'w', encoding= 'utf-8') as file:
  18. file.writelines( '\n'.join(filename_list))
  19. print( '视频图片保存成功, 共有 %d 张' % count)
  20. return fps
  21. input_video = 'work/videos/Master_Ma.mp4'
  22. fps = transform_video_to_image(input_video, 'work/mp4_img/')

一共是获取到了564张图片。

然后使用PaddleSeg将所有的视频图片,进行人像分割,生成mask图片。


  
  1. # 生成mask结果图片
  2. python 你的路径/PaddleSeg/pdseg/vis.py \
  3. --cfg 你的路径/work/humanseg.yaml \
  4. --vis_dir 你的路径/work/mp4_img_mask

使用模型进行预测,其中humanseg.yaml文件是作者提供的,可以进行图像分割。

预训练模型deeplabv3p_xception65_humanseg,需下载解压安装放在PaddleSeg/pretrained_model下。

由于预训练模型较大,就不放网盘上了,直接访问下面这个链接即可下载。


  
  1. # 下载预训练模型deeplabv3p_xception65_humanseg
  2. https://paddleseg.bj.bcebos.com/models/deeplabv3p_xception65_humanseg.tgz

记得需要将humanseg.yaml文件中的路径信息,修改成你自己的路径。

运行上面那三行命令,最后就会生成564张mask文件。

 

/ 03 / 词云生成

使用stylecloud词云库生成词云,使用字体方正兰亭刊黑。


  
  1. def create_wordcloud():
  2. for i in range( 564):
  3. file_name = os.path.join( "mp4_img_mask/", str(i) + '.png')
  4. # print(file_name)
  5. result = os.path.join( "work/mp4_img_analysis/", 'result' + str(i) + '.png')
  6. # print(result)
  7. stylecloud.gen_stylecloud(text=text_content,
  8. font_path= '方正兰亭刊黑.TTF',
  9. output_name=result,
  10. background_color= "black",
  11. mask_img=file_name)

因为stylecloud库无法自定义词云图片,所以我修改了它的代码。

给gen_stylecloud添加了mask_img这个参数,最终作用在gen_mask_array这个函数上。

如此就能将mask图片转化成词云图!

将这些词云图片合并成视频。


  
  1. def combine_image_to_video(comb_path, output_file_path, fps=30, is_print=False):
  2. '''
  3. 合并图像到视频
  4. '''
  5. fourcc = cv2.VideoWriter_fourcc(* 'mp4v')
  6. file_items = [item for item in os.listdir(comb_path) if item.endswith( '.png')]
  7. file_len = len(file_items)
  8. # print(comb_path, file_items)
  9. if file_len > 0:
  10. print(file_len)
  11. temp_img = cv2.imread(os.path.join(comb_path, file_items[ 0]))
  12. img_height, img_width, _ = temp_img.shape
  13. out = cv2.VideoWriter(output_file_path, fourcc, fps, (img_width, img_height))
  14. for i in range(file_len):
  15. pic_name = os.path.join(comb_path, 'result' + str(i) + ".png")
  16. print(pic_name)
  17. if is_print:
  18. print(i + 1, '/', file_len, ' ', pic_name)
  19. img = cv2.imread(pic_name)
  20. out.write(img)
  21. out.release()
  22. combine_image_to_video( 'work/mp4_img_analysis/', 'work/mp4_analysis.mp4', 30)

使用ffmpeg对视频进一步的处理,裁剪+重叠。


  
  1. # 视频裁剪
  2. ffmpeg -i mp4_analysis_result.mp4 -vf crop=iw:ih/ 2: 0:ih/ 5 output.mp4
  3. # 视频重叠
  4. ffmpeg -i output.mp4 -i viedeos/Master_Ma.mp4 -filter_complex "[1:v]scale=500:270[v1];[0:v][v1]overlay=1490:10" -s 1920x1080 -c:v libx264 merge.mp4
  5. # 添加音频
  6. ffmpeg -i merge.mp4 -i videos/Master_Ma.mp4 -c:v copy -c:a copy work/mp4_analysis_result2.mp4 -y
  7. # 生成gif图
  8. ffmpeg -ss 00: 00: 22 -t 3 -i merge.mp4 -r 15 a.gif

ffmpeg的安装及使用就得靠大伙自己百度啦~

在这里还是要推荐下我自己建的Python开发学习群:1156465813,群里都是学Python开发的,如果你正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2020最新的Python进阶资料和高级开发教程,欢迎进阶中和进想深入Python的小伙伴!


转载:https://blog.csdn.net/qq_38887171/article/details/110168906
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场