ffmpeg+python實現視頻分割


需求

簡單視頻分割

原因

開始使用了好幾款國產的剪輯軟件,不管收費的還是免費的,都存在這些問題,一效率太低,二畫質會變低,三文件會變大。這些軟件一般都是切割后的文件碼率都會改變,然后切割完成等待生成副本的時間非常長。

后來發現了ffmpeg,在輸入幾行指令,視頻可以切割生成速度非常快,並且保持原文件的碼率。但使用起來也很難受,因為指令需要需要手動輸入原文件的路徑和生成后的路徑。最近學了兩天的python,突然覺得可以結合來用。python中也有一個ffmpeg模塊,這個應該很強大,可能用這個會更好,但我的需求就是分割,所以就沒有去了解它。

使用

安裝ffmpeg,配置環境變量Path 如:D:\下載\軟件\ffmpeg-4.4-essentials_build\bin

將代碼復制到一個新建py文件中,雙擊py文件,根據終端提示既可以完成視頻切割,視頻切割完的時間簡直秒殺,用起來簡直不要太爽。

代碼業務邏輯

獲取當前路徑的所有文件結合序號展示出來,用序號選擇文件,將文件的路徑放在ffmpeg的指令上,通過python將指令在終端中打開。

代碼如下:
import os
dir = os.getcwd()

    # 獲取當前的目錄
def get_files():
    files = []
    for root, dirs, files in os.walk(dir):
        files = files
    return files


def show_files():
    # 通過序號展示文件
    files = get_files()
    print('files')
    for index in range(len(files)):
        print(index+1, files[index])


def cutting(file_id, time_str):
    files = get_files()
    # 保存選擇的文件路徑
    file_selected = files[int(file_id)-1]
    file_path = dir + '\\' + file_selected

    # 將當前目錄下所有.mp4的文件拆分為沒有后綴的文件保存到一個列表中
    cur_list = []
    list1 = []
    file1 = file_selected.split('.mp4')[0]
    for item in files:
        if '.mp4' in item:
            item = item.split('.mp4')
            list1.append(item[0])

    # 將源文件和副本都保存到一個列表中
    for item in list1:
        if file1 in item:
            cur_list.append(item)

    # 通過list1的長度給后續的副本加序號
    cutting = file_path.split('.mp4')
    copy_path = cutting[0] + '_' + str(len(cur_list)) + '.mp4'
    cur_list.append(copy_path)

    time_list = time_str.split(' ')
    start_list = []
    for i in range(len(time_list) - 1):
        start_list.append(time_list[i])
    start_time = ":".join(start_list)
    duration = time_list[len(time_list) - 1]
    print(start_time, duration)

    ff = f'ffmpeg -ss {start_time} -i {file_path} -t {duration} -c copy {copy_path}'
    os.system(ff)

show_files()

file_id = input('選擇一個視頻文件:')
# 切割一段 00 00 00 10  開始時間00 00 00    時長10
# 切割多段 00 00 00 10,00 00 00 20,00 00 00 30
time_str = input("輸入時間,切割一段 00 00 00 10 切割多段 00 00 00 10,00 00 00 20:")
if ',' in time_str:
    time_list = time_str.split(',')
    for time_str in time_list:
        cutting(file_id,time_str)
else:
 cutting(file_id,time_str)



 


免責聲明!

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



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