【发布时间】:2020-03-03 05:09:36
【问题描述】:
我意识到这里有人问过类似的问题,所以在指向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
我需要处理这些视频两次吗?如果我可以进行任何优化,请告诉我。此外,如果有任何关于在一段时间内显示绘制文本的指示,文档似乎有点参差不齐,因为它与控制持续时间有关,我不确定这些值的含义或它们如何相互影响。
谢谢
【问题讨论】:
-
这似乎纯粹是一个关于 ffmpeg 的问题,所以 pyhon 代码只是妨碍了事情并使事情复杂化。在接触 python 之前让 ffmpeg 命令工作。您没有在一个 ffmpeg 命令中连接和使用 drawtext(s) 的原因是什么?
-
完整的解决方案将使用 python 解析数据源并根据规定的标准组装视频。即使我有一个有效的 FFMPEG 命令行示例,这也无助于我将其移植到上述场景。我试图弄清楚为什么 ffmpeg-python 在使用它们的绑定时会遇到麻烦,因为命令行显然应该能够完成我想要做的事情。
标签: python ffmpeg video-processing