簡體   English   中英

使用 MoviePy 修復未定稿的 .flv 視頻

[英]Using MoviePy to fix unfinalized .flv video

在使用 OBS 捕獲記錄我的屏幕時,我積累了大量被迫關閉系統的視頻,使它們未完成。 這些視頻是使用 .flv 格式創建的,所以當我在 VLC 播放器中播放它們時,它們可以完美播放,但是它們缺少結束時間(視頻長度)。 相反,視頻在播放時顯示運行時間,但保持 00:00 結束時間,盡管實際視頻播放了幾分鍾。

未完成視頻的播放欄

據我了解,與 .mp4 格式不同,如果 .flv 格式的視頻尚未最終確定,則應該能夠恢復(例如我的鏡頭因意外關機而停止)。 由於我有大量未完成的,我需要一個自動化的解決方案來修復它們。


使用 MoviePy write_videofile

我嘗試在 python shell 中使用 MoviePy write_videofile命令修復視頻,並將目錄設置為壞視頻的目錄:

from moviepy.editor import *               #no error
vid = VideoFileClip("oldVideoName.flv")    #no error
vid.write_videofile("corrected.mp4")       #IndexError

創建的最后一行簡短地創建了一個文件“correctedTEMP_MPY_wvf_snd.mp3”(只有 1KB,在 Audacity 中無法播放),在拋出異常之前不久。 我收到了大量的回溯,最終閱讀:

  File "\Python37-32\lib\site-packages\moviepy\audio\io\readers.py", line 168, in get_frame
    "Accessing time t=%.02f-%.02f seconds, "%(tt[0], tt[-1])+
IndexError: index 0 is out of bounds for axis 0 with size 0

我認為這是由音頻閱讀器不接受假定的 00:00 時間戳作為視頻長度的問題引起的。


使用 MoviePy 子subclip

我試圖看看是否有一種方法可以使用subclip方法手動為 MoviePy 提供開始和結束時間戳。 我知道視頻至少有 4 秒長,所以我用它作為控制測試:

clip = vid.subclip("00:00:00", "00:00:05") #no error
clip.write_videofile("corrected.mp4")      #OSError

write_videofile 方法再次拋出異常:

File "\Python37-32\lib\site-packages\moviepy\audio\io\readers.py", line 169, in get_frame
    "with clip duration=%d seconds, "%self.duration)
OSError: Error in file oldVideoName.flv, 
Accessing time t=0.00-0.04 seconds, with clip duration=0 seconds,

即使這種方法有效,我也需要找到一種方法來自動化發現視頻結束時間的過程。


使用 OpenCV CAP_PROP_FRAME_COUNT

根據這篇文章,找到結束時間(視頻長度)的一種可能解決方案是使用 cv2。

import cv2                                #no error
vid=cv2.VideoCapture("oldVideoName.flv")  #no error
vid.get(cv2.CAP_PROP_FRAME_COUNT)         #returns -5.534023222112865e+17

我沒想到會收到此值的負浮點數。 進一步的測試告訴我,這個浮點數與視頻的長度根本不對應,因為所有未完成的視頻為此請求返回相同的浮點數。 (普通視頻確實會為此方法調用返回它們的長度)這對於迭代識別未完成視頻的目錄很有用。


使用 MoviePy 糾正大量未定稿的視頻是一種可行甚至可能的解決方案嗎? 使用 cv2 (Python OpenCV) 來解決這個問題會更好嗎?

我能夠使用yamdi修復視頻文件, yamdi是一個用於 FLV 文件的開源元數據注入器。 下載並安裝 yamdi 后,我可以使用以下命令修復名為oldVideoName.flv的 .flv 文件:

yamdi -i oldVideoName.flv -o corrected.flv

該命令葉子oldVideoName.flv不變,並保存修復的文件corrected.flv

暫無
暫無

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

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