mlt:使用无损编解码器的图像失真

问题描述

我有两个 1920x1080 PNG 文件center.pngright.png,除了 right.png 中的图像水平移动了 325 像素之外,它们是相同的。

使用 mlt XML,我使用无损 FFV1 格式制作了一个两秒长的视频,显示一秒钟的 center.png,然后显示一秒钟的 right.png。这是我的文件foo.mlt

<?xml version='1.0' encoding='utf-8'?>                                           
<mlt>                                                                            
  <profile width="1920" height="1080"                                            
           display_aspect_num="1920" display_aspect_den="1080"                   
           sample_aspect_num="1" sample_aspect_den="1"                           
           colorspace="709" progressive="1"                                      
           frame_rate_num="30" frame_rate_den="1"/>                              
                                                                                 
  <consumer mlt_service="avformat" properties="lossless/FFV1" target="out.mkv"/> 
                                                                                 
  <producer id="center" mlt_service="qimage" resource="center.png" length="30"/> 
  <producer id="right"  mlt_service="qimage" resource="right.png"  length="30"/> 
                                                                                 
  <playlist>                                                                     
    <entry producer="center"/>                                                   
    <entry producer="right"/>                                                    
  </playlist>                                                                    
</mlt> 

然后我在终端运行 melt foo.mlt 并在我的视频查看器中检查输出文件 out.mkv。然而,仔细观察,当 right.png 出现在视频中时,它会略微失真(带有某种光晕型伪影)。这是放大图:

enter image description here

奇怪的是,只有 right.png 图像失真; center.png 显示正确,即使两个图像除了定位之外完全相同。

这是一个错误吗?我不希望使用无损编解码器出现任何图像失真,但也许我做错了什么。

我的规格:

Ubuntu 20.04.2 LTS,64 位
融化 6.25.0
ffmpeg 版本 4.2.4-1ubuntu0.1

谢谢

解决方法

“无损”并不总是无损的。在“无损/FFV1”的情况下,色度格式为 4:2:2,这会将色度分辨率降低一半: https://github.com/mltframework/mlt/blob/master/presets/consumer/avformat/lossless/FFV1 这可能是相关的,因为如果需要格式转换,它可能会导致未直接落在色度样本上的像素的色度渗色。

作为实验,您可以尝试将图像移动 326 像素而不是 325 像素,以查看是否仍然出现渗色。

不久前还有另一个问题与色度子采样导致的出血有关: Melt composite transition is slightly blending