1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        裝逼篇 | 抖音超火的九宮格視頻是如何生成的,Python 告訴你答案

        共 4440字,需瀏覽 9分鐘

         ·

        2020-09-01 06:43


        點(diǎn)擊上方“AirPython”,選擇“加為星標(biāo)

        第一時(shí)間關(guān)注 Python 原創(chuàng)干貨!


        1. 場(chǎng)景

        如果你經(jīng)常刷抖音和微信朋友圈,一定發(fā)現(xiàn)了最近九宮格短視頻很火!

        從朋友圈九宮格圖片,到九宮格視頻,相比傳統(tǒng)的圖片視頻,前者似乎更有個(gè)性和逼格

        除了傳統(tǒng)的剪輯軟件可以實(shí)現(xiàn),是否有其他更加快捷方便的方式?比如:一鍵生成,批量生成?

        廢話不多說,本篇文章將大家使用 Python 一鍵生成九宮格短視頻,優(yōu)雅地幫你在朋友圈裝一次逼!

        2.準(zhǔn)備

        在開始實(shí)戰(zhàn)之前,使用 pip 安裝 2 個(gè)依賴,分別是:

        1、視頻處理依賴?moviepy

        2、圖片處理依賴?PIL

        #?安裝兩個(gè)依賴
        #?視頻處理
        pip3?install?moviepy

        #?圖片處理依賴
        pip3?install?Pillow

        3.實(shí)戰(zhàn)一下

        在實(shí)戰(zhàn)之前,先準(zhǔn)備一段原始視頻素材

        下面通過?6?個(gè)步驟,將原始視頻轉(zhuǎn)換為九宮格視頻

        1、新建處理文件夾

        新建一個(gè)臨時(shí)文件夾和一個(gè)視頻輸出文件夾

        def?mkdir_folder(file_path):
        ????"""
        ????創(chuàng)建一個(gè)文件夾,如果不存在就創(chuàng)建;否則不做處理
        ????:param?file_path:
        ????:return:
        ????"""

        ????if?os.path.exists(file_path):
        ????????return

        ????os.mkdir(file_path)

        #?新建臨時(shí)文件夾和輸出文件夾
        mkdir_folder(self.path_temp)
        mkdir_folder(self.path_output)

        2、獲取視頻的音頻文件及視頻基礎(chǔ)信息

        首先,根據(jù)原始視頻,使用 moviepy?構(gòu)建一個(gè)?VideoFileClip 對(duì)象,從而獲取到視頻的寬、高、幀率、時(shí)長(zhǎng)等信息

        self.video_raw_clip?=?VideoFileClip(file_path)

        #?寬、高
        self.video_width,?self.video_height?=?self.video_raw_clip.w,?self.video_raw_clip.h

        #?幀率
        self.fps?=?self.video_raw_clip.fps

        #?視頻時(shí)長(zhǎng)
        self.during?=?self.video_raw_clip.duration

        接著,從視頻中提取?BGM 音頻對(duì)象,并寫入到文件中

        def?get_audio_from_video(video_raw_clip,?output_path):
        ????"""
        ????從視頻中提取音頻
        ????:param?video_raw_clip:?視頻Clip對(duì)象
        ????:param?output_path:?輸出音頻文件完整路徑
        ????:return:
        ????"""

        ????audio?=?video_raw_clip.audio
        ????audio.write_audiofile(output_path)

        ????return?output_path

        3、處理視頻幀

        我們使用原始視頻?Clip 對(duì)象的?iter_frames() 方法,循環(huán)獲取所有的視頻幀圖片

        需要指出的是,為了保證后面視頻合成的便捷性,這里對(duì)視頻幀的文件名按順序進(jìn)行命令

        i?=?1
        for?frame?in?self.video_raw_clip.iter_frames():
        ?????image?=?Image.fromarray(frame)

        ?????#?視頻幀圖片保存的臨時(shí)路徑(完整路徑)
        ?????frame_file_complete_path?=?self.path_temp?+?"%04d.jpg"?%?i

        ?????i?+=?1

        視頻每一幀都被裁剪成 9 張圖片,我們可以顯式指定圖片之間的距離,然后計(jì)算出新畫布的寬和高,最后繪制一個(gè)白底背景的圖片

        #?1、剪成9張圖片,計(jì)算每張圖片的寬、高
        item_width?=?int(self.video_width?/?3)
        item_height?=?int(self.video_height?/?3)

        #?2、新的寬、高
        item_width_new?=?self.video_width?+?self.item_space?*?2
        item_height_new?=?self.video_height?+?self.item_space?*?2

        #?3、重新建一個(gè)畫布背景
        new_image?=?Image.new(image.mode,?(item_width_new,?item_height_new),
        ??????????????????????????????color='white')

        接著,獲取每一塊區(qū)域的坐標(biāo)值,針對(duì)橫向、縱向第 2、3 個(gè)圖片區(qū)域加上間隔偏移,粘貼到上面新建的圖片上即可

        #?4、裁剪圖片,然后粘貼到新的畫布中去
        # i:橫向、j:縱向
        for?i?in?range(0,?3):
        ???for?j?in?range(0,?3):
        ????????#?裁剪區(qū)域
        ????????box?=?(j?*?item_width,?i?*?item_height,?(j?+?1)?*?item_width,?(i?+?1)?*?item_height)

        ????????#?根據(jù)區(qū)域,裁剪圖片
        ????????crop_image?=?image.crop(box)

        ????????#?橫向、縱向第2塊和第3塊,要加上偏移距離
        ????????x?=?0?if?j?==?0?else?(item_width?+?self.item_space)?*?j
        ????????y?=?0?if?i?==?0?else?(item_height?+?self.item_space)?*?i

        ????????#?將9張圖片,按照上面計(jì)算的坐標(biāo)值,粘貼到背景中去
        ????????new_image.paste(crop_image,?(int(x),?int(y)))

        ????????#?保存圖片到本地
        ????????new_image.save(frame_file_complete_path)

        4、一籃子圖片重新合成視頻

        把上一步生成的幀圖片,按照原視頻的幀率轉(zhuǎn)為視頻

        需要注意的是,為了保證生成的視頻不會(huì)錯(cuò)亂,最好對(duì)幀圖片按照名稱進(jìn)行一次排序

        def?pics_to_video(pics_path,?output_path,?fps):
        ????"""
        ????圖片轉(zhuǎn)為視頻
        ????pics_to_video('./../gif_temp/',?'./../video_temp/temp1.mp4',?20)
        ????:param?pics_path:
        ????:param?output_path:
        ????:return:
        ????"""

        ????image_paths?=?list(map(lambda?x:?pics_path?+?x,?os.listdir(pics_path)))

        ????#?注意:這里必須進(jìn)行一次排序,保證所有幀的順序是一致
        ????image_paths?=?sort_strings_with_emb_numbers(image_paths)

        ????#?過濾掉非圖片
        ????image_paths?=?list(filter(lambda?image_path:?image_path.endswith('.jpg'),?image_paths))

        ????#?圖片剪輯類
        ????clip?=?ImageSequenceClip(image_paths,
        ?????????????????????????????fps=fps)

        ????clip.write_videofile(output_path)

        5、加入 BGM 背景音樂

        將原始視頻的音頻文件設(shè)置到上一步生成的視頻文件,然后寫入一個(gè)新的文件中去

        def?video_with_audio(path_video_raw,?path_bgm_raw,?output):
        ????"""
        ????視頻合成音頻
        ????:return:
        ????"""

        ????videoclip?=?VideoFileClip(path_video_raw)
        ????audioclip?=?AudioFileClip(path_bgm_raw)

        ????#?設(shè)置視頻音頻,并寫入到文件中去
        ????videoclip.set_audio(audioclip).write_videofile(output,
        ???????????????????????????????????????????????????codec='libx264',
        ???????????????????????????????????????????????????audio_codec='aac',
        ???????????????????????????????????????????????????temp_audiofile='temp-audio.m4a',
        ???????????????????????????????????????????????????remove_temp=True
        ???????????????????????????????????????????????????)

        6、刪除臨時(shí)文件

        利用 shutil將上面視頻處理的臨時(shí)文件,包含幀圖片、臨時(shí)視頻文件刪除

        def?remove_folder(file_path):
        ????"""
        ????刪除文件夾
        ????:param?file_path:
        ????:return:
        ????"""

        ????shutil.rmtree(file_path)

        #?刪除臨時(shí)文件
        remove_folder(self.path_temp)

        7、查看效果

        以東莞仔、渣哥、烏鴉的一段視頻為例,最終處理后的效果如下:

        4.最后

        通過上面的一系列操作,我們實(shí)現(xiàn)了將一段視頻處理成九宮格視頻

        我已經(jīng)將文中全部源碼,包含:生成九宮格視頻和圖片兩套代碼?上傳到后臺(tái),關(guān)注公眾號(hào)后回復(fù)「九宮格?」即可獲得全部源碼

        如果你覺得文章還不錯(cuò),請(qǐng)大家?點(diǎn)贊、分享、留言?下,因?yàn)檫@將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!


        留言送書

        本周贈(zèng)書:《 Python數(shù)據(jù)分析與可視化
        PS:中獎(jiǎng)名單將于下周一在交流群公布



        推薦閱讀


        帶你用 Python 實(shí)現(xiàn)自動(dòng)化群控(入門篇)

        這些自動(dòng)化場(chǎng)景,批處理完全可以取代 Python

        我用幾行 Python 自動(dòng)化腳本完美解決掉了小姐姐的微信焦慮感



        瀏覽 144
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            胡桃给旅行者特殊的奖励视频 | 国产成人精品视频免费看 | 韩国gayxxxxgay21 | 人妻偷拍视频 | 草草久久综合高潮影院 | 在线免费福利 | 日韩中文字幕一区二区三区四区 | 色婷婷一区二区三区久久午夜成人 | 欧美打屁股调教spank网站 | 囯产精品久久久久久久久九秃爱 |