亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python使用ffmpeg合成視頻、音頻的實(shí)現(xiàn)方法

 更新時(shí)間:2022年04月22日 12:12:47   作者:宿者朽命  
這篇文章主要介紹了Python使用ffmpeg合成視頻、音頻,通過(guò)本文的學(xué)習(xí)能幫助大家了解如何在python中調(diào)用ffmpeg模塊,對(duì)此進(jìn)行音視頻合并,完成視頻合成,需要的朋友可以參考下

最近有在使用屏幕錄制軟件錄制桌面,在用的過(guò)程中突發(fā)奇想,使用python能不能做屏幕錄制工具,也鍛煉下自己的動(dòng)手能力。
接下準(zhǔn)備寫(xiě)使用python如何做屏幕錄制工具的系列文章:

錄制屏幕制作視頻

錄制音頻

合成視頻,音頻

基于pyqt5制作可視化窗口

大概上述四個(gè)部分,希望自己能夠盡快完善,前兩篇文章分享了利用opencv制作了屏幕錄制部分,利用PyAudio錄制音頻,本篇文章分享如何使用ffmpeg將同時(shí)錄制的屏幕錄像和音頻合成為有聲音的屏幕錄像。

應(yīng)用平臺(tái)

  • windows 10
  • python 3.7
  • ffmpeg

音視頻合成

在python合成音視頻有很多第三方包,操作方法各有不同,有簡(jiǎn)易的也有稍微復(fù)雜的,

起初也有想過(guò)使用moviepy中文文檔,其在使用門(mén)檻上確實(shí)比ffmpeg要小很多,在翻查相關(guān)資料后,目前要考慮的事是合并音視頻為一個(gè)有聲音的視頻,而且ffmpeg具有錄制視頻的功能,效果比使用cv2+ImageGrab方式要好,所以采用ffmpeg作為合成工具,ffmpeg.exe下載路徑,使用手冊(cè) 。

python下使用ffmpeg,可以直接調(diào)用命令行工具,也可以使用封裝的第三包。

pip install ffmpeg-python

使用參數(shù)與ffmpeg一致,不同處在于,在使用完后需要鍵入終止條件以結(jié)束ffmpeg的運(yùn)行。

將cv2的屏幕錄制改成ffmpeg錄制

import ffmpeg

# 屏幕錄制畫(huà)面大小
width = 1920
height = 1080
# 錄制幀率,在cv2錄制中,發(fā)現(xiàn)幀率比較固定且偏小,主要原因?yàn)镮mageGrab間隔時(shí)間稍長(zhǎng)
# 這里可以調(diào)整的稍微大一點(diǎn),當(dāng)然越大對(duì)固件性能越好,推薦在15~60之間(含)
fps = 30
# 錄制畫(huà)面是否包含鼠標(biāo),0:不包含,1:包含
# 錄制方式為gdigrab模式,包含鼠標(biāo)在錄制過(guò)程會(huì)看到鼠標(biāo)頻閃的現(xiàn)象,可自行搜索模塊插件解決
draw_mouse = 0
# 屏幕畫(huà)面錄制偏移距離
offset_x = 0
offset_y = 0
# 文件名稱(chēng)
filename = 'test.mp4'
# 錄制桌面
process = (
            ffmpeg.output(
                ffmpeg.input(
                    filename='desktop', format='gdigrab', framerate=fps, offset_x=offset_x, offset_y=offset_y,
                    draw_mouse=draw_mouse, s=f'{width}x{height}'),
                filename=filename, pix_fmt='yuv420p'
            ).overwrite_output()
        )
# cmd: ffmpeg路徑,如不設(shè)置,會(huì)搜尋環(huán)境變量下的ffmpeg
# 可直接下載ffmpeg.exe到工程文件目錄下
ffmpeg_path = 'ffmpeg.exe'
process.run_async(cmd=ffmpeg_path, pipe_stdin=True, pipe_stdout=False, pipe_stderr=False)
# 自定義延時(shí)函數(shù)
delay()
# 傳入中斷參數(shù),在調(diào)用之前,盡量在之前有足夠的延時(shí)
process.communicate(str.encode("q"))
process.terminate()

合成音視頻

# 傳入的視頻路徑
video_path = 'mp4_test.mp4'
# 傳入的音頻路徑
audio_path = 'mp3_test.mp3'
# 生成的視頻名稱(chēng),不要和上述的路徑一致
output_path = 'mixer.mp4'

process = (
            ffmpeg.output(
                ffmpeg.input(filename=video_path),
                ffmpeg.input(filename=audio_path),
                filename=output_path, vcodec='copy', acodec='aac', strict='experimental', pix_fmt='yuv420p'
            ).overwrite_output()

ffmpeg_path = 'ffmpeg.exe'
process.run_async(cmd=ffmpeg_path, pipe_stdin=True, pipe_stdout=False, pipe_stderr=False)

time.sleep(1)
process.communicate(str.encode("q"))
process.terminate()

ps: 上述方法也可以封裝到類(lèi)中,方便pyqt5窗口的實(shí)現(xiàn)。

看到這里可能會(huì)想到,有音頻錄制,視頻錄制,音視頻合成,但是不好讓音視頻分開(kāi)錄制,導(dǎo)致音視頻不同步,看起來(lái)也別扭,下面就來(lái)實(shí)現(xiàn)將兩者同時(shí)錄制同時(shí)結(jié)束。

可沿用錄制屏幕制作視頻(推薦用本篇下方的代碼),錄制音頻 兩篇里的代碼,將關(guān)于鍵盤(pán)監(jiān)聽(tīng)部分注釋掉,避免沖突。

from threading import Thread
from pynput import keyboard
from Audio_record import AudioRecord
from Screenshot_record import Screenshot

def hotkey():
    """熱鍵監(jiān)聽(tīng)"""
    with keyboard.Listener(on_press=on_press) as listener:
        listener.join()
def on_press(key):
    try:
        video.terminate()
        if key.char == 't':  # t鍵,錄制結(jié)束,保存音視頻
            audio.stop_flag = True
        elif key.char == 'k':  # k鍵,錄制中止,刪除文件
            audio.kill = True
            video.unlink('test.mp4')
    except Exception as e:
        print(e)
key_thread = Thread(target=hotkey, daemon=True)
audio = AudioRecord()
video = Screenshot()
key_thread.start()
audio.run(filename='test.mp3')
video.record('test.mp4')

利用三組線程,當(dāng)該代碼運(yùn)行時(shí)就會(huì)監(jiān)聽(tīng)鍵盤(pán)按鍵,同時(shí)錄制音頻、視頻,當(dāng)按下t鍵結(jié)束錄制,保存音視頻。

總結(jié)

通過(guò)音視頻分線程錄制,保證兩個(gè)文件的時(shí)長(zhǎng)一致且同步的情況,在這過(guò)程中學(xué)習(xí)了如何在python中調(diào)用ffmpeg模塊,對(duì)此進(jìn)行音視頻合并,完成視頻合成。

遠(yuǎn)處的峰亦不能遮擋看到山后的風(fēng)景。

于二零二二年四月十七日作

ffmpeg錄屏源代碼:

"""
Screenshot_record.py 使用ffmpeg錄制屏幕
from pathlib import Path
import ffmpeg

class Screenshot:
    def __init__(self, width=1920, height=1080, fps=15):
        self.width = width
        self.height = height
        self.fps = fps
        self.process = None
        self.ffmpeg_path = file_path('ffmpeg.exe')
    def __call__(self, width, height, fps=None):
        self.fps = fps if fps else self.fps
    @staticmethod
    def unlink(filename):
        Path(filename).unlink()
    def record(self, filename, offset_x=0, offset_y=0, draw_mouse=0):
        self.process = (
            ffmpeg.output(
                ffmpeg.input(
                    filename='desktop', format='gdigrab', framerate=self.fps, offset_x=offset_x, offset_y=offset_y,
                    draw_mouse=draw_mouse, s=f'{self.width}x{self.height}'),
                filename=filename, pix_fmt='yuv420p'
            ).overwrite_output()
        )
        self.ffmpeg_async()
    def compose_audio(self, video_path, audio_path, output_path):
                ffmpeg.input(filename=video_path),
                ffmpeg.input(filename=audio_path),
                filename=output_path, vcodec='copy', acodec='aac', strict='experimental', pix_fmt='yuv420p'
    def ffmpeg_async(self):
        self.process = self.process.run_async(cmd=self.ffmpeg_path, pipe_stdin=True, pipe_stdout=False,
                                              pipe_stderr=False)
    def terminate(self):
        if self.process is not None:
            self.process.communicate(str.encode("q"))
            self.process.terminate()
            self.process = None

到此這篇關(guān)于Python使用ffmpeg合成視頻、音頻的文章就介紹到這了,更多相關(guān)python ffmpeg合成視頻音頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python capitalize()函數(shù)的用法詳解

    Python capitalize()函數(shù)的用法詳解

    在Python中,capitalize()將字符串的第一個(gè)字符轉(zhuǎn)換為大寫(xiě)字母,并將所有其他字符(如果有的話)轉(zhuǎn)換為小寫(xiě),本文就將給大家介紹一下Python capitalize()函數(shù)的使用方法,感興趣的朋友跟著小編一起來(lái)看看吧
    2023-07-07
  • 用Python代碼自動(dòng)生成文獻(xiàn)的IEEE引用格式的實(shí)現(xiàn)

    用Python代碼自動(dòng)生成文獻(xiàn)的IEEE引用格式的實(shí)現(xiàn)

    這篇文章主要介紹了用Python代碼自動(dòng)生成文獻(xiàn)的IEEE引用格式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python3獲取url文件大小示例代碼

    python3獲取url文件大小示例代碼

    這篇文章主要介紹了python3獲取url文件大小,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • python 百度aip實(shí)現(xiàn)文字識(shí)別的實(shí)現(xiàn)示例

    python 百度aip實(shí)現(xiàn)文字識(shí)別的實(shí)現(xiàn)示例

    百度aip將圖片或掃描件中的文字識(shí)別成可編輯的文本,本文主要介紹了python 百度aip實(shí)現(xiàn)文字識(shí)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-08-08
  • python對(duì)文檔中元素刪除,替換操作

    python對(duì)文檔中元素刪除,替換操作

    這篇文章主要介紹了python對(duì)文檔中元素刪除,替換操作,pthon更換文檔中某元素、python改變或者刪除txt文檔中某一列元素,下文具體代碼實(shí)現(xiàn)需要的小伙伴可以參考一下
    2022-04-04
  • python亂序字符串排序的實(shí)現(xiàn)方式

    python亂序字符串排序的實(shí)現(xiàn)方式

    這篇文章主要介紹了python亂序字符串排序的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python在畫(huà)圖時(shí)使用特殊符號(hào)的方法總結(jié)

    Python在畫(huà)圖時(shí)使用特殊符號(hào)的方法總結(jié)

    在制作圖表時(shí),如果遇到需要利用特殊符號(hào)進(jìn)行表示時(shí)該怎么辦呢?不用慌,這篇文章為大家總結(jié)了python畫(huà)圖中使用各種特殊符號(hào)的方式,需要的可以參考一下
    2022-04-04
  • Flask框架模板繼承實(shí)現(xiàn)方法分析

    Flask框架模板繼承實(shí)現(xiàn)方法分析

    這篇文章主要介紹了Flask框架模板繼承實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了模板繼承的應(yīng)用場(chǎng)景及flask實(shí)現(xiàn)模板繼承的相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • Python的ORM框架中SQLAlchemy庫(kù)的查詢(xún)操作的教程

    Python的ORM框架中SQLAlchemy庫(kù)的查詢(xún)操作的教程

    這篇文章主要介紹了Python的ORM框架中SQLAlchemy庫(kù)的查詢(xún)操作的教程,SQLAlchemy用來(lái)操作數(shù)據(jù)庫(kù)十分方便,需要的朋友可以參考下
    2015-04-04
  • Python3編碼問(wèn)題 Unicode utf-8 bytes互轉(zhuǎn)方法

    Python3編碼問(wèn)題 Unicode utf-8 bytes互轉(zhuǎn)方法

    今天小編就為大家分享一篇Python3編碼問(wèn)題 Unicode utf-8 bytes互轉(zhuǎn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10

最新評(píng)論