實例:通過調用外部程序進行錄制視頻(ffmpeg.exe)


相關知識點:

1. ffmpeg可以用下面的參數來錄制Windows 桌面操作的視頻。 ffmpeg.exe -y -rtbufsize 100M -f gdigrab -framerate 10 -draw_mouse 1 -i desktop -c:v libx264 -r 20 -crf 35 -pix_fmt yuv420p -fs 100M "fffffffffffffffff" 其中 fffffffffffffffff 部分 是需要填入 產生的視頻文件名。 錄制過程中,用戶按鍵盤 q 鍵,可以退出錄制。
2. ffmpeg還可以用來合並視頻文件,windows下面的格式如下 ffmpeg.exe -f concat -i concat.txt -codec copy out.mp4 其中concat.txt 是要合並視頻的文件列表。格式如下,每行以file 開頭 后面是要合並的視頻文件名: file 20170330_110818.mp4 file 20170330_110833.mp4

 

題目:

下載ffmpeg程序 (進入 http://ffmpeg.zeranoe.com/builds/ 點擊 Download FFmpeg按鈕即可) 要求大家寫一個python程序,運行后提示用戶是要做什么操作,如下 '請選擇您要做的操作:1:錄制視頻,2:合並視頻:' 如果用戶輸入1並回車, 則調用ffmpeg錄制視頻文件,產生在當前目錄下面。 要求錄制的視頻文件名 是當前時間(年月日_時分秒.mp4格式), 比如 '20170330_093612.mp4' (怎么產生這種時間格式的字符串,不知道的請自行網上搜索方法) 如果用戶輸入2並回車,則按字母順序列出當前目錄下所有的 mp4為擴展名 的視頻文件(怎么列出,請自行網上搜索方法),並在前面編上序號。如下所示 --------------------------------- 目錄中有這些視頻文件: 1 - 20170329_202814.mp4 2 - 20170330_093251.mp4 3 - 20170330_093612.mp4 請選擇要合並視頻的視頻文件序號(格式 1,2,3,4) : --------------------------------- 用戶輸入視頻序號(序號以逗號隔開)后, 程序合並視頻文件, 輸出的合並后視頻文件名 固定為 out.mp4

 

答案:

import os,time

# 錄制視頻:1、獲取當前時間並進行格式化;2、錄制的視頻存入當前目錄
def recordvideo(testcase_dir):
formtime = time.strftime('%Y%m%d_%H%M%S',time.localtime()) # 定義時間格式作為文件名
filename = testcase_dir + '/' + formtime + '.mp4'

# 錄制視頻命令,"\"實現拼接多行而不會出現換行符
ffcommand = 'ffmpeg.exe -y -rtbufsize 100M -f gdigrab -framerate 10 -draw_mouse 1 -i desktop '+\
'-c:v libx264 -r 20 -crf 35 -pix_fmt yuv420p -fs 100M ' + filename

# 進入對應的目錄執行ffmpeg命令,多條命令用&&分隔,用";"分號沒效果
os.system(r'cd D:\Python37-32\project_test\pythondevelop\ffmpeg\bin && ' + ffcommand)

# 合並視頻:1、按字母順序列出當前目錄下所有mp4為擴展名的文件;2、在每個文件前面加上編號;3、根據用戶選擇的序號合並視頻為out.mp4
def mergevideo(testcase_dir):
filenames = sorted(os.listdir(testcase_dir),key=lambda x:str(x[:-4]))
videolists = [] # 存放已排序和編號的mp4視頻
i = 1 # 用於作為文件的編號
for file in filenames:
if '.mp4' in file:
name = str(i) + '-' + file
videolists.append(name)
i += 1

selnum = input('請選擇要合並視頻的視頻文件序號(格式如1,2,3,4):')

# 根據輸入的序號獲取對應視頻名稱寫入concat.txt文件
selnumlist = selnum.split(',') # 獲取輸入的序號
with open('concat.txt','w') as f:
for num in selnumlist:
videoname = "file '" + testcase_dir + '/'+ videolists[int(num)-1].split('-')[1] + "'\n" # 獲取寫入concat.txt的每個視頻
f.write(videoname)
f.close()

# 合並視頻
command = 'ffmpeg.exe -f concat -safe 0 -i ' + testcase_dir + '\concat.txt -codec copy ' + testcase_dir + '\out.mp4'
os.system(r'cd D:\Python37-32\project_test\pythondevelop\ffmpeg\bin && ' + command)

testcase_dir = os.path.dirname(os.path.realpath(__file__)) # 獲取當前文件的目錄
while True:
# 根據用戶輸入的信息進入對應的操作
instr = input('請選擇您要做的操作(1、錄制視頻;2、合並視頻):')
# 錄制視頻
if instr == '1':
recordvideo(testcase_dir)
# 合並視頻
elif instr == '2':
mergevideo(testcase_dir)
else:
break


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM