簡體   English   中英

連接 mp4 視頻后的 ffmpeg-python drawtext

[英]ffmpeg-python drawtext after concatenating mp4 videos

我意識到這里已經提出了一個類似的問題,所以在指出那個問題和答案之前,請理解我的問題是不同的。 我希望有人能指出我正確的方向。

簡而言之,我有 5 個視頻片段,根據用戶輸入將它們連接起來並重新排序。 有沒有一種方法可以在輸入上動態繪制文本而無需第二次處理視頻?

這是我正在運行的代碼,但正如您所看到的,我需要打開連接的文件並將文本應用於該版本。 然后將文件另存為副本。

我正在尋找一種更優雅的方式來實現這一點。 任何建議,將不勝感激。

        video1 = ffmpeg.input('./assets/v_1.mp4')
        video2 = ffmpeg.input('./assets/v_2.mp4')
        video3 = ffmpeg.input('./assets/v_3.mp4')
        video4 = ffmpeg.input('./assets/v_4.mp4')
        video5 = ffmpeg.input('./assets/v_5.mp4')



        print(row)

        ## IF Row 1 and 2 have values they get all five.
        if row[1] == '1' and row[2] == '1':
            print("Matches here");
            outfile = row[0]+'.mp4'
            ##DO Stuff
            joined = ffmpeg.concat(video1.video,video1.audio,video2.video,video2.audio,video3.video,video3.audio,video4.video,video4.audio,video5.video,video5.audio, v=1,a=1,unsafe=1).node
            vj = joined[0]
            va = joined[1].filter('volume', 1)

            out = ffmpeg.output(vj,va, outfile)
            out.run()
            ## Once Concat Video is finished, then it draws text over the video. 
            input2 = ffmpeg.input(row[0]+'.mp4').drawtext(fontfile='/Users/jserra/Library/Fonts/Cocogoose-Condensed-Regular-trial.ttf',fontsize='60',timecode='00:00:00:00',r=60,text=row[0],fontcolor='black',escape_text=True)
            ffmpeg.output(input2,row[0]+'_1.mp4').run()

我試過這個並收到以下錯誤:

video1 = ffmpeg.input('./assets/StMarys_1.mp4').drawtext(fontfile='/Users/jserra/Library/Fonts/Cocogoose-Condensed-Regular-trial.ttf',fontsize='60',timecode='00:00:00:00',r=60,text=row[0],fontcolor='black',escape_text=True)

錯誤:

    .virtualenvs/cvtesting/lib/python3.6/site-packages/ffmpeg/_run.py", line 93, in _allocate_filter_stream_names
    upstream_node, upstream_label
ValueError: Encountered drawtext(fontcolor='black', fontfile='/Users/jserra/Library/Fonts/Cocogoose-Condensed-Regular-trial.ttf', fontsize='60', r=60, text='jack', timecode='00:00:00:00') <1d2ff6bbf3f0> with multiple outgoing edges with same upstream label None; a `split` filter is probably required

我也試着鏈接它的視頻與級聯后joined 我仍然收到錯誤。

joined = ffmpeg.concat(video1.video,video1.audio,video2.video,video2.audio,video3.video,video3.audio,video4.video,video4.audio,video5.video,video5.audio, v=1,a=1,unsafe=1).drawtext(fontfile='/Users/jserra/Library/Fonts/Cocogoose-Condensed-Regular-trial.ttf',fontsize='60',timecode='00:00:00:00',r=60,text=row[0],fontcolor='black',escape_text=True).node

我需要處理這些視頻兩次嗎? 如果我可以進行任何優化,請告訴我。 此外,如果有任何關於在一段時間內顯示繪制文本的指示,文檔似乎有點參差不齊,因為它與控制持續時間有關,我不確定這些值的含義或它們如何相互影響。

謝謝

好的,對於那些在不是 1:1 翻譯的示例之后遇到問題的人,這就是我所意識到的。

如果我將 drawtext 過濾器應用於在 join[0] 中返回的視頻,我可以在正確的位置添加文本,而無需對視頻進行兩次編碼或處理。

我假設這與 drawtext 只能應用於視頻而不是音頻(這是有道理的)的事實有關。

## IF Row 1 and 2 have values they get all five.
        if row[1] == '1' and row[2] == '1':
            print("Matches here");
            outfile = row[0]+'.mp4'

            ##DO Stuff
            joined = ffmpeg.concat(video1.video,video1.audio,video2.video,video2.audio,video3.video,video3.audio,video4.video,video4.audio,video5.video,video5.audio, v=1,a=1,unsafe=1).node

            print(type(joined))
            print(joined);
            vj = joined[0].drawtext(fontfile='/Users/js/Library/Fonts/Cocogoose-Condensed-Regular-trial.ttf',fontsize='600',x=100,y=10,text=row[0],fontcolor='white',escape_text=True,enable='between(t,1,2.5)')
            va = joined[1].filter('volume', 1)

            out = ffmpeg.output(vj,va, outfile)
            out.run()

我確信這不是一個徹底的解釋,但根據我運行的測試,這似乎是有意義的。 在我概述問題的第一個示例中,音頻在第二次處理后從視頻中刪除。 這就是讓我想到將 drawtext 過濾器僅應用於 join joined[0]返回的視頻的原因,因為它似乎與音頻競爭。

暫無
暫無

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

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