python - 连接mp4视频后的ffmpeg-python drawtext

标签 python ffmpeg video-processing

我意识到这里有人问过类似的问题,所以在指向 that question and answer 之前,请理解我的问题是不同的。我希望有人能指出我正确的方向。

简而言之,我有 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过滤器应用于joined [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 过滤器应用于 joined[0] 中返回的视频的原因。因为它似乎在与音频竞争。

关于python - 连接mp4视频后的ffmpeg-python drawtext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60489562/

相关文章:

python - 如何用字符串训练机器学习?

python - Tensorflow 图像分类 Python 总是说相同的答案

visual-c++ - 如何使用 ffmpeg 的库将 YUV422 图像转换为 JPEG?

Python moviepy ImageClip() 生成损坏的文件

python - 有没有一个Python模块可以在不网格化的情况下对数据进行轮廓绘制

python - 如何在 django 请求工厂发布请求中设置 request.body?

javascript - 如何在浏览器(尤其是 Chrome)中将视频和摄像头录制合并在一起?

video - 使用 ffmpeg 或 ffprobe 获取视频的像素位深度

ffmpeg : how to determine frame rate automatically?

c# - 加载视频文件并选择单个帧