Py学习  »  Python

震惊!小伙竟然用python找出了马大师视频中的名场面

不正经的kimol君 • 3 年前 • 282 次点击  

前言

最近江湖中涌现出了一位风云人物,他的语录成为了不少小伙的“精神食粮”,而其名场面也是数不胜数,他便是—— 混元形意太极门掌门马大师
在这里插入图片描述

今天,kimol君将通过B站上马大师视频的弹幕分析出其中的 高潮部分 (即名场面),选取其中播放量靠前的视频( 视频地址 )进行分析,效果如下:
在这里插入图片描述
红色部分代表视频中弹幕数较多的位置,而这通常出现在视频的高潮部分,图中时间点表示高潮部分出现在视频中的位置。对照着 原视频 进行比较,结果定会让你 大吃一惊

详细分析过程,客官您往下看~
理论来说,该方法是通用的,完全可以用来分析不同的视频,发现其中高潮的部分(通常是戏剧冲突、高潮桥段、爆点等部分)。因此,具有较高的实用性!

一、爬取视频弹幕

爬取马大师视频(bvid为 BV1HJ411L7DP )的弹幕,并将结果存于本地csv中:
在这里插入图片描述
一共有3W+条弹幕。至于弹幕的具体爬取过程,由于篇幅原因这里不在赘述,大家可以参考我的 另一篇博文

二、弹幕分析

弹幕分析的思路也比较简单,通过统计弹幕在视频中不同时间出现的频数来表示出当时观众的反映:通常来讲,当视频出现高潮时,弹幕数量也会相应增加。那么,整个分析过程可以分为三步:

1. 弹幕频数统计

按照指定的视频播放时间间隔来统计弹幕的数量,定义一个函数:

def count_fre(time_list,second=1):
    '''
    统计弹幕出现时间的频数(按指定second划分)
    输入:出现时间的列表,划分的秒数
    输出:频数分布
    '''
    f = lambda x:(x//second)*second 
    time_list = time_list.apply(f) # 按照second将时间进行划分
    counter = dict(Counter(time_list)) # 统计各时间段出现的频数
    counter = sorted(counter.items(),key=lambda d:d[0]) # 按照字典的key排序
    return dict(counter)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

统计后的输出为一个字典,key为时间段,value为对应的弹幕数:
在这里插入图片描述

2. 绘制频数分布图

利用python中的matplotlib库将统计好的频数分布绘制出来:

# 绘制分布图
plt.title('弹幕频数分布') 
plt.xlabel('播放时间(秒)')
plt.ylabel('弹幕评论频数(个)')
plt.grid()
plt.plot(x,y)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结果如下:
在这里插入图片描述

3. 标红高潮部分

为了更直观地反映出高潮部分,用红色将其标出,并加上对应的时间点:

# 标红高潮部分
flag = False
start = 0 # 开始位置
end = 0   # 结束位置
level = np.percentile(y,90)
for i in range(len(y)):
    if flag == False and y[i] >= level:
        flag = True
        start = i-1 if i-1 >= 0 else 0 # 避免低于0
    if flag == True and y[i] < level:
        flag = False
        end = i+1
        end = i+1 if i+1 <= len(x) else len(x) # 避免超过最大值
        plt.plot(x[start:end],y[start:end],color='red') # 标红
        pos_y = max(y[start:end]) # 高潮
        pos_x = y[start:end].index(pos_y)+start # 找到高潮对应的点
        pos_x = x[pos_x] # 找到高潮对应的时间(秒)
        m,s = divmod(pos_x,60) 
        text = '%02d:%02d'%(m,s) # 转为mm:ss的格式
        plt.text(pos_x+1,pos_y,text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

其中 level变量 取弹幕数的X分位数,是高潮的阈值,即认为当弹幕数大于level才认为是高潮部分。通过对它的设定,即可控制高潮标红的部分。

三、大师的名场面

通过对高潮部分进行标红后,可以得到下图:
在这里插入图片描述
可以看出,短短2分多钟的视频可谓是 高潮迭起 (小声嘀咕:“不要想歪了…”)

其中 02:27 的位置弹幕数量最高,打开视频一看,妹有错,名场面来了,年轻人 耗子尾汁 呀:
在这里插入图片描述
其中 01:39 的位置同样是名场面, 我大E了啊,没有闪
在这里插入图片描述
其余的部分也是类似的,由于时间原因这里就不全都展示了,感兴趣的小伙伴可以自己一一对应看看。

写在最后

通过简单的测试,该代码除了可以发掘马大师的名场面外,在诸如其他电影、电视剧上的分析效果也都不错。理论上来说,只要有比较充足的弹幕数据,就能找到 视频的高潮 所在,您还不心动吗?😉

最后,感谢各位大大的耐心阅读,咋们下次再会~

如果需要 完整代码 可以关注下方公众号,后台回复“ 弹幕分析 ”即可获取,kimol君期待着您的光临~
在这里插入图片描述

创作不易,大侠请留步… 动起可爱的双手,来个赞再走呗 (๑◕ܫ←๑)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/99331
 
282 次点击