ffmpeg-在应用多遍工作流程时保持视频质量,每个工作流程都包括在视频编辑中再次进行解码和编码

问题描述

我正在使用FFMPEG库进行一些视频处理,并且由于滤镜和图像叠加的复杂性,我必须多次运行该过程。 这意味着,我的过程是这样的: 打开原始视频,对其进行解码,运行-complex_filter,以原始视频编码的任何格式重新压缩视频。 从第一遍打开输出,运行另一个-complex_filter等。 有时我必须做3-4次以上。我担心的是,每次压缩都会使视频质量下降-显而易见的迹象是,每次通过时文件的大小都会缩小。

以上所述,我有两个问题:

  1. 有意义的是,在第一次操作之后,我选择了无损格式,而不是将视频保存为原始格式,然后一次又一次地执行通过操作,因为我知道质量仍然是同样,然后在最后一遍,我将其一次压缩为源格式。如果是这样,您会推荐哪种格式的视频? ProRes 4444?我考虑使用其他格式吗?我应该设置任何参数并从编码保留到编码吗?

  2. 我每走一步,都会带走音频和其他元数据的所有额外流。 剥离除视频之外的所有内容,一遍又一遍地运行我的视频段落,而不需要添加-c:a副本和c:s副本,会不会更有效率?然后在我的最终运行中,将所有从原始源流合并到输出文件?如果是,我将如何具体执行ffmpeg命令?我的视频有1个视频流+ 15个音频流+一些我的ffmpeg无法读取的tmcd。

谢谢。

编辑1:

如果输入视频的视频编解码器= dvvideo,并且视频的尺寸为1280x1080,则表示视频没有典型的正方形像素。 我首先需要调整视频的大小,这样才能放大视频。然后,我可以运行我的过滤器:

pass-1:-vf scale = 1920x1080(如果视频的x / y比例正常,则跳过此步骤) pass-2:-filter_complex:调用我的特殊过滤器,该过滤器为视频添加了一些专有水印 pass-3:-filter_complex:“ 0 overlay = 5:21:enable ='介于(t,2,3)+介于(t,4,5)+介于(t,6,8)'之间” (唯一的目的是在上一步中放置水印的位置附近插入icon.png。) pass-4:-vf scale = 1280x1080(如果执行过pass-1,则此步骤将视频缩放)

我将来可能会在某个时候重写我的'C'过滤器代码,以适应这种检查1280x1080的逻辑,并插入icon.png并一步一步完成,但是就目前而言,我认为如果是普通视频,则仅使用两步处理,如果需要缩放,则使用4步处理,并使用无损格式的内容作为临时文件解决方案(我任意选择了 ProRes 4444 v5,但打开了提出建议),应将重新压缩视频时的损失降到最低。

步骤1和4是有条件的,并且仅在以下情况下适用: 如果 vcodec =='dvvideo' aspect_ratio :#1280x1080比例约为1.16 我运行步骤1-> 4。否则,仅执行步骤2和3:

第一步:

ffmpeg -i in.mov -vf scale=1920x1080 -map 0:v? -map 0:a? -map 0:s? -map_metadata 0 -b:v 115084915 -maxrate 115084915 -minrate 115084915 -c:v prores_ks -profile:v 5 -preset ultrafast -crf 0 -c:a copy -timecode 00:00:00.00 -c:s copy -y step2.mov

第二步:

ffmpeg -i step2.mov -filter_complex " myFilter=enable='between(t,30)':x=15:y=25:size=95:etc-etc..." -map 0:v? -map 0:a? -map 0:s? -map_metadata 0 -b:v 115084915 -maxrate 115084915 -minrate 115084915 -c:v prores_ks -profile:v 5 -preset ultrafast -crf 0 -c:a copy -timecode 00:00:00.00 -c:s copy -y step3.mov

Step3:

ffmpeg -i step3.mov -i icon.png -filter_complex "[0][1]overlay=15:20:enable='between(t,1,3.600)+between(t,4,5.500)+between(t,6,20)' " -map 0:v? -map 0:a? -map 0:s? -map_metadata 0 -b:v 115084915 -maxrate 115084915 -minrate 115084915 -c:v prores_ks -profile:v 5 -preset ultrafast -crf 0 -c:a copy -timecode 00:00:00.00 -c:s copy -y step4.mov

第四步:

ffmpeg -i step4.mov -map 0:v? -vf scale=1280x1080 -map 0:a? -map 0:s? -c:v dvvideo -pix_fmt yuv422p -b:v 115084915 -maxrate 115084915 -minrate 115084915 -r 29.97 -top 1 -color_primaries bt709 -color_trc bt709 -colorspace bt709 -vtag dvh6 -map_metadata 0 -c:a copy -timecode 00:00:00.00 -c:s copy -y final-output.mov

自从我发布了全部ffmpeg命令集以来,也许有人会建议如何使输出匹配输入,这样我就不会丢失时间码输入:

input is on the left panel,my output is on the right

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...