FFMPEG:如何将 24 bpp MP4 转换为具有 rgb565le 格式的 16 bpp AVI?

FFMPEG:如何将 24 bpp MP4 转换为具有 rgb565le 格式的 16 bpp AVI?

摘要:我正在尝试弄清楚(我猜是举个例子)如何使用缩放器 src_format/dst_format 标签将其转换为目标设备的特定 16 bpp RGB 格式。

我正在处理一些较旧的硬件,它使用 64 MB 的小型 SD 卡播放视频。是的,MB。显示器只有 640x480,我最近发现它有一个 16 位/像素的视频驱动程序,我思考是 5:6:5 RGB。最后一部分是新的,可能解释了为什么动画部分中有渐变填充的输入文件会显示奇怪的带状行为 - 大量闪烁的块。

输入文件是各种各样的东西——来自各地的各种大小的视频文件(但长度不超过 45 秒),我使用 FFMPEG 将输入格式转换为目标格式:

AVI 容器 XVID 视频,300 kbps 左右 MP3 音频,96 kbps 单声道或立体声 640x480 尺寸以适合屏幕 小文件大小,以便 SD 卡上可以容纳 10 个左右的文件,以及播放循环程序(按今天的标准,它是一种旧的、低技术的设备,并且由于多种原因无法更改)

几周前我已经为第一批转换运行了一个转换设置,但人们对输出的质量不满意,并且 MediaInfo 一直报告比特率远远超过了 300K 的期望值。

我一直在使用 libxvid 编解码器,但实际上有一个错误记录 (#6217),表明 -b:v 300K 属性不适用于该编解码器,但 mpeg4 编解码器可以工作。过去几天的一些实验让我相信了这一点。我还发现,我可以使用 mpeg4 编解码器将目标比特率提高到大约 500 kbps,最终得到一个合理大小的输出文件(40s 文件大约 3 MB)。

到目前为止我得到的结果是这样的:

ffmpeg -y -i "input.mp4" -s 640x480 -aspect 4:3 -vf fps=24 -g 12 -c:v mpeg4 -vtag xvid -src_format yuv420p -sws_flags full_chroma_int+accurate_rnd+lanczos -b:v 500k -pass 1 -an -f avi NUL
ffmpeg -y -i "input.mp4" -s 640x480 -aspect 4:3 -vf fps=24 -g 12 -c:v mpeg4 -vtag xvid  -sws_flags full_chroma_int+accurate_rnd+lanczos -b:v 500k -pass 2 -c:a libmp3lame -b:a 96k "output.avi"

我得到可以在设备上播放的文件,但渐变部分非常块状且闪烁严重,在目标设备上播放时,带有大块红色阴影的区域会出现各种伪影。当我在 Windows 笔记本电脑上使用 VLC 播放输出视频时,也可以看到这些伪影。它们在目标设备上看起来更糟。

我尝试使用 -q:vn(其中 n 介于 2 和 8 之间) - 质量有所好一些,但文件大小不切实际。

我确实意识到,当我缩小输出尺寸并尝试大幅削减生成的文件时,为了获得令人满意的视频,我正在进行一场艰苦的战斗。

然而,在我进行了大量谷歌搜索后,我今天遇到了一些关于从 YUV(MediaInfo 所说的我的特定测试文件)到 16bpp RBG 的像素转换的内容。但我不知道正确的咒语是什么,以尝试生成一个输出文件,该文件试图解释我设备的较低颜色深度。尝试了一些反对我在命令行中添加 -dst_format rgb565le 的方法。

有人能解释一下吗,或者给我指出一个在命令行上执行此操作的示例?谢谢。

相关内容