年輕人不講武德,竟用Python讓馬老師表演閃電五連鞭!
11月份的頭條,是屬於馬保國的。
一位69歲的老同志,慘遭年輕人偷襲,不講武德。
看看把老同志欺負的...
要不是馬老師講仁義講道德,甩手就是一個五連鞭。
哈哈哈,所以本期我們就用Python給馬保國老師做一個閃電五連鞭動態詞雲圖。
詞雲資料來自B站,使用stylecloud詞雲庫繪製。
主要參考百度AI Studio上的一個開源專案,使用PaddleSeg對人像進行分割。
年輕人,不講武德。這樣好嗎,耗子尾汁。
PS:如有需要Python學習資料的小夥伴可以加點選下方連結自行獲取
/ 01 / 彈幕資料獲取
沒從B站上直接爬取,使用第三方庫bilibili_api。
這是一個用Python寫的呼叫Bilibili各種API的庫,範圍涵蓋視訊、音訊、直播、動態、專欄、使用者、番劇等。
地址:https://passkou.com/bilibili_api/docs/
使用video模組下面的兩個方法,可以獲取11月每天的視訊彈幕。
首先需要獲取SESSDATA和CSRF(bili_jct)的值。
谷歌瀏覽器可以通過下圖檢視,域名選擇bilibili.com。
以點選量為排序,選取排行第一的視訊獲取彈幕。沒想到馬老師老早就火了,耗子尾汁。
點選排名第一的視訊,然後在瀏覽器的訪問欄獲取BV號,BV1HJ411L7DP。
獲取彈幕程式碼如下。
-
from bilibili_api import video, Verify
-
import datetime
-
# 引數
-
verify = Verify("你的SESSDATA值", "你的bili_jct值")
-
# 獲取存在歷史彈幕的日期列表
-
days = video.get_history_danmaku_index(bvid="BV1HJ411L7DP", verify=verify)
-
print(days)
-
# 獲取彈幕資訊,並儲存
-
for day in days:
-
danmus = video.get_danmaku(bvid="BV1HJ411L7DP", verify=verify, date=datetime.date(*map(int, day.split('-'))))
-
print(danmus)
-
f = open(r'danmu.txt', 'a')
-
for danmu in danmus:
-
print(danmu)
-
f.write(danmu.text + '\n')
-
f.close()
得到結果。
我大E了啊,沒有閃。
使用jieba對彈幕資料進行分詞處理。
-
import jieba
-
def get_text_content(text_file_path):
-
'''
-
獲取填充文字內容
-
'''
-
text_content = ''
-
with open(text_file_path, encoding='utf-8') as file:
-
text_content = file.read()
-
# 資料清洗,只儲存字串中的中文,字母,數字
-
text_content_find = re.findall('[\u4e00-\u9fa5a-zA-Z0-9]+', text_content, re.S)
-
text_content = ' '.join(jieba.cut(str(text_content_find).replace(" ", ""), cut_all=False))
-
print(text_content)
-
return text_content
-
text_content = get_text_content('danmu.txt')
選取馬保國原版素材視訊,B站上有高清的。
地址:https://www.bilibili.com/video/BV1JV41117hq
參考網上的資料,執行如下程式碼即可下載B站視訊。
-
from bilibili_api import video, Verify
-
import requests
-
import urllib3
-
# 引數
-
verify = Verify("你的SESSDATA值", "你的bili_jct值")
-
# 獲取下載地址
-
download_url = video.get_download_url(bvid="BV1JV41117hq", verify=verify)
-
print(download_url["dash"]["video"][0]['baseUrl'])
-
baseurl = 'https://www.bilibili.com/video/BV1JV41117hq'
-
title = '馬保國'
-
def get_video():
-
urllib3.disable_warnings()
-
headers = {
-
'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',
-
'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',
-
'Accept-Encoding': 'gzip, deflate, br',
-
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'
-
}
-
headers.update({'Referer': baseurl})
-
res = requests.Session()
-
begin = 0
-
end = 1024 * 1024 - 1
-
flag = 0
-
temp = download_url
-
filename = "./" + title + ".flv"
-
url = temp["dash"]["video"][0]['baseUrl']
-
while True:
-
headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)})
-
res = requests.get(url=url, headers=headers, verify=False)
-
if res.status_code != 416:
-
begin = end + 1
-
end = end + 1024 * 1024
-
else:
-
headers.update({'Range': str(end + 1) + '-'})
-
res = requests.get(url=url, headers=headers, verify=False)
-
flag = 1
-
with open(filename, 'ab') as fp:
-
fp.write(res.content)
-
fp.flush()
-
if flag == 1:
-
fp.close()
-
break
-
print('--------------------------------------------')
-
print('視訊下載完成')
-
filename = "./" + title + ".mp3"
-
url = temp["dash"]["audio"][0]['baseUrl']
-
while True:
-
headers.update({'Range': 'bytes=' + str(begin) + '-' + str(end)})
-
res = requests.get(url=url, headers=headers, verify=False)
-
if res.status_code != 416:
-
begin = end + 1
-
end = end + 1024 * 1024
-
else:
-
headers.update({'Range': str(end + 1) + '-'})
-
res = requests.get(url=url, headers=headers, verify=False)
-
flag = 1
-
with open(filename, 'ab') as fp:
-
fp.write(res.content)
-
fp.flush()
-
if flag == 1:
-
fp.close()
-
break
-
print('音訊下載完成')
記得新增SESSDATA和CSRF(bili_jct)的值
/ 02 / PaddleSeg人像分割
基於百度AI Studio的專案,專案地址:
https://aistudio.baidu.com/aistudio/projectdetail/1176398
首先下載解壓安裝PaddleSeg相關依賴包。
-
# 下載PaddleSeg
-
git clone https://hub.fastgit.org/PaddlePaddle/PaddleSeg.git
-
cd PaddleSeg/
-
# 安裝所需依賴項
-
pip install -r requirements.txt
通常去「GitHub」上下載東西,速度都比較慢,可以使用加速連結。
這裡的fastgit.org一加,下載速度就能從幾十K飆升到幾兆每秒。
-
# 新建資料夾
-
mkdir work/videos
-
mkdir work/texts
-
mkdir work/mp4_img
-
mkdir work/mp4_img_mask
-
mkdir work/mp4_img_analysis
新建一些資料夾,主要用來存放相關檔案的。
這裡可以將之前爬取到的視訊和音訊放置在videos中。
先對素材視訊進行抽幀,就是獲取視訊每幀的圖片。
-
def transform_video_to_image(video_file_path, img_path):
-
'''
-
將視訊中每一幀儲存成圖片
-
'''
-
video_capture = cv2.VideoCapture(video_file_path)
-
fps = video_capture.get(cv2.CAP_PROP_FPS)
-
count = 0
-
while (True):
-
ret, frame = video_capture.read()
-
if ret:
-
cv2.imwrite(img_path + '%d.jpg' % count, frame)
-
count += 1
-
else:
-
break
-
video_capture.release()
-
filename_list = os.listdir(img_path)
-
with open(os.path.join(img_path, 'img_list.txt'), 'w', encoding='utf-8') as file:
-
file.writelines('\n'.join(filename_list))
-
print('視訊圖片儲存成功, 共有 %d 張' % count)
-
return fps
-
input_video = 'work/videos/Master_Ma.mp4'
-
fps = transform_video_to_image(input_video, 'work/mp4_img/')
一共是獲取到了564張圖片。
然後使用PaddleSeg將所有的視訊圖片,進行人像分割,生成mask圖片。
-
# 生成mask結果圖片
-
python 你的路徑/PaddleSeg/pdseg/vis.py \
-
--cfg 你的路徑/work/humanseg.yaml \
-
--vis_dir 你的路徑/work/mp4_img_mask
使用模型進行預測,其中humanseg.yaml檔案是作者提供的,可以進行影像分割。
預訓練模型deeplabv3p_xception65_humanseg,需下載解壓安裝放在PaddleSeg/pretrained_model下。
由於預訓練模型較大,就不放網盤上了,直接訪問下面這個連結即可下載。
-
# 下載預訓練模型deeplabv3p_xception65_humanseg
-
https://paddleseg.bj.bcebos.com/models/deeplabv3p_xception65_humanseg.tgz
記得需要將humanseg.yaml檔案中的路徑資訊,修改成你自己的路徑。
執行上面那三行命令,最後就會生成564張mask檔案。
/ 03 / 詞雲生成
使用stylecloud詞雲庫生成詞雲,使用字型方正蘭亭刊黑。
-
def create_wordcloud():
-
for i in range(564):
-
file_name = os.path.join("mp4_img_mask/", str(i) + '.png')
-
# print(file_name)
-
result = os.path.join("work/mp4_img_analysis/", 'result' + str(i) + '.png')
-
# print(result)
-
stylecloud.gen_stylecloud(text=text_content,
-
font_path='方正蘭亭刊黑.TTF',
-
output_name=result,
-
background_color="black",
-
mask_img=file_name)
因為stylecloud庫無法自定義詞雲圖片,所以我修改了它的程式碼。
給gen_stylecloud新增了mask_img這個引數,最終作用在gen_mask_array這個函式上。
如此就能將mask圖片轉化成詞雲圖!
將這些詞雲圖片合併成視訊。
-
def combine_image_to_video(comb_path, output_file_path, fps=30, is_print=False):
-
'''
-
合併影像到視訊
-
'''
-
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
-
file_items = [item for item in os.listdir(comb_path) if item.endswith('.png')]
-
file_len = len(file_items)
-
# print(comb_path, file_items)
-
if file_len > 0:
-
print(file_len)
-
temp_img = cv2.imread(os.path.join(comb_path, file_items[0]))
-
img_height, img_width, _ = temp_img.shape
-
out = cv2.VideoWriter(output_file_path, fourcc, fps, (img_width, img_height))
-
for i in range(file_len):
-
pic_name = os.path.join(comb_path, 'result' + str(i) + ".png")
-
print(pic_name)
-
if is_print:
-
print(i + 1, '/', file_len, ' ', pic_name)
-
img = cv2.imread(pic_name)
-
out.write(img)
-
out.release()
-
combine_image_to_video('work/mp4_img_analysis/', 'work/mp4_analysis.mp4', 30)
使用ffmpeg對視訊進一步的處理,裁剪+重疊。
-
# 視訊裁剪
-
ffmpeg -i mp4_analysis_result.mp4 -vf crop=iw:ih/2:0:ih/5 output.mp4
-
# 視訊重疊
-
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
-
# 新增音訊
-
ffmpeg -i merge.mp4 -i videos/Master_Ma.mp4 -c:v copy -c:a copy work/mp4_analysis_result2.mp4 -y
-
# 生成gif圖
-
ffmpeg -ss 00:00:22 -t 3 -i merge.mp4 -r 15 a.gif
ffmpeg的安裝及使用就得靠大夥自己百度啦~
相關文章
- 年輕程式設計師不講武德,做表竟然拖拉拽程式設計師
- 程式設計師苦應用部署久矣,docker獻計閃電五連鞭程式設計師Docker
- 年輕人不講武德,竟然想白嫖我的開發神器
- redis自述:年輕MySQL不講武德,耗子尾汁RedisMySql
- 年輕人不講武德,竟然重構出這麼優雅後臺 API 介面API
- 年輕人不講武德不僅白piao介面測試知識還白piao介面測試工具會員
- 再見,米哈遊!原神社群防f12控制檯除錯程式碼全解(年輕人不講武德)除錯
- 我勸!這位年輕人不講MVCC,耗子尾汁!MVC
- 遊戲行業產品荒“不講武德”遊戲行業
- 結婚人數連年降,這屆年輕人為啥不結婚?
- 攝像機不智慧,基本等於不講武德
- 從個人炫技到商業獲利 勒索軟體當真“不講武德”?
- EXCEL你“不講武德”!這個功能逆天到爆Excel
- 【趙強老師】MySQL的閃回MySql
- RabbitMQ不講武德,發個訊息也這麼多花招MQ
- 程式設計師講述一線城市年輕人的生活工作實錄程式設計師
- 聚焦“工程師文化”,TDengine 創始人陶建輝在 TOP 100Summit 上發表演講工程師MIT
- 不講武德:以太坊2.0竟然今天已經開始啟動
- 為什麼年輕人不愛加班
- xbox手柄閃爍但是連不上電腦怎麼解決
- 美國老師和中國老師講灰姑娘,這就是差距!
- python老師的部落格Python
- 【2019年6月全新大學英語四六級】有道的老師講的不錯哦!想要嗎!【全】
- AI 臉部美容,一鍵讓你變瘦變美變老變年輕AI
- 電音盯上游戲:誘人的不僅是年輕使用者和流量成本
- 滑鐵盧大學:研究表明老師有責任不讓學生在課堂上上網
- 一個老程式設計師的程式設計之路,寫給年輕的程式設計師們程式設計師
- 現在的年輕人對父母的養老問題存在哪些擔憂?
- 掘金開發者大會閃電演講議題徵集
- 劉鐵猛老師視訊課程“事件”講解程式事件
- 轉行程式設計師難麼?阿里巴巴五年老鳥:程式設計學不好的只有3種人行程程式設計師阿里
- 太囂張了!他竟用Python繞過了“驗證碼”Python
- 阿里架構師Peter老師講述Java程式設計師→架構師所需要掌握的技能阿里架構Java程式設計師
- 閃迪固態硬碟接入電腦不識別了硬碟
- 馬斯克預測:十年內人類能夠將大腦和電腦連線起來馬斯克
- 電腦連不上網怎麼回事 電腦連不上網的解決方法
- 大刀闊斧還是小修小補?SE老IP的復活之路總讓人悔不當初
- 你不應該忽略《雙人成行》真正的閃光點