簡體   English   中英

如何使用 python 連接一堆視頻?

[英]How to Concatenate bunch of videos using python?

所以,我有超過 5000 個需要組合的小片段。 為了在他們的名字上應用各種自定義過濾器,我想用 python 來做。 我有以下代碼:

import os
from moviepy.editor import *
os.chdir('D:/videos')
list1, list2 = os.listdir(), []

for i in list1: #filtering
    if i[-6:] != '-l.mp4' and i[-7:] != 'ALT.mp4':
        list2.append(i)
print('Getting Video Info:')

final = VideoFileClip(list2[0])


for i in range(1,len(list2)):
    final = concatenate_videoclips([final, VideoFileClip(list2[i])])
    print('\r' + str(i+1) + '/' + str(len(list2)), end='')


os.chdir('D:')
final.write_videofile('Merged.mp4')

但是該程序正在創建大量進程,並且在讀取 150 個剪輯后就崩潰了。 在此處輸入圖像描述 一直在增加? 有沒有更簡單的方法/替代方法來做到這一點? 謝謝!

編輯:
我也嘗試過使用 ffmpeg,但是由於 concat 協議不支持.mp4 擴展名,因此連接會刪除音頻 在這種情況下。 即使我將所有文件轉換為 .ts 擴展名並嘗試將它們連接起來WindowsError: [Error 206] The filename or extension is too long彈出,因為用 | 分隔的文件太多。 將所有文件轉換為 .ts 格式后,我做了以下更改:

import os
import ffmpeg
os.chdir('D:/videos')
list1 = os.listdir()
list2 = [i for i in list1 if i[-3:] == '.ts']
list2[0] = ffmpeg.input(list2[0])
for i in range(1, len(list2)):
    list2[i] = ffmpeg.concat(list2[i-1], ffmpeg.input(list2[i]))
    print('\r' + str(i) + '/' + str(len(list2)), end='')
ffmpeg.output(list2[-1], 'D:\Merged.mp4')
ffmpeg.run(list2[-1])

但現在我得到RecursionError: maximum recursion depth exceeded while calling a Python object

您可以嘗試像這樣顯式刪除並在兩者之間進行垃圾收集。

import os
import gc
from moviepy.editor import *
os.chdir('D:/videos')
list1, list2 = os.listdir(), []

for i in list1: #filtering
    if i[-6:] != '-l.mp4' and i[-7:] != 'ALT.mp4':
        list2.append(i)
print('Getting Video Info:')

final = VideoFileClip(list2[0])


for i in range(1,len(list2)):
    curclip = VideoFileClip(list2[i])
    final = concatenate_videoclips([final, curclip])
    print('\r' + str(i+1) + '/' + str(len(list2)), end='')
    curclip.close()
    del curclip
    gc.collect()

os.chdir('D:')
final.write_videofile('Merged.mp4')

如果上述方法不起作用,請嘗試以特定頻率保存最終視頻,例如 8。保存和讀取為原始文件將釋放額外的 memory 累積在最終 object 中

for i in range(1,len(list2)):
    if (i % 8) == 7:
        final.write_videofile('D:/Merged.mp4')
        final = VideoFileClip('D:/Merged.mp4')
    curclip = VideoFileClip(list2[i])
    final = concatenate_videoclips([final, curclip])
    print('\r' + str(i+1) + '/' + str(len(list2)), end='')
    curclip.close()
    del curclip
    gc.collect()

os.chdir('D:')
final.write_videofile('Merged.mp4')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM