我正在使用 ffmpeg 将 JPG 添加到 MP4 以制作 MP4。
由于制作视频只有一张图片,我想知道是否有办法减小视频尺寸?
命令:
$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4
结果:
image.jpg
= 26.7K(图像不太清晰)audio.mp3
= 64.6M(54 分钟)output.mp4
= 80.6M(视频效果不太清晰,音乐仍然不错)
对于 MP4 来说这个尺寸合理吗?
答案1
用于上传至 YouTube
H.264:最小文件
此方法使用 libx264 编码 H.264 视频。它比下面的流复制方法慢,但可能会输出较小的文件大小。
ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv
流复制:最快的过程
这种方法只是流复制(不编码)将图像放入 MKV 容器中。它非常快,但如果大小很重要,则上述方法可能会生成较小的文件。
ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
YouTube 几乎可以接受任何内容,因此这些命令使用了一些技巧来加快编码速度,或减小文件大小,并保持高质量,因为 YouTube 会重新编码您提供的任何内容。您的播放器可能不会喜欢它,但 YouTube 会喜欢。
在这些示例中,使用了非常低的帧速率,其处理速度应该比默认的 25 fps 更快。
与任何播放器最广泛的兼容性
ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
这应该可以在除了非常古老的设备之外的任何设备上播放(如果是这种情况,请更改
-profile:v main
为)。-profile:v baseline
如果您的音频输入已经是 AAC,则更改为,
-c:a aac
以-c:a copy
避免不必要的重新编码。与上面的 YouTube 命令相比,编码时间会更长,文件大小也会更大。
看FFmpeg 维基:H.264了解更多信息。
答案2
仅根据您提供的信息,这就是我能想到的。
让我们逐个来看:
由于视频中只添加了一张图片。我想知道是否有办法减小视频大小,例如强制比特率/秒 = 1 而不是 28?
因为它是静止图像,所以无需改变。只需保持静止。
你在这里谈论的是每秒帧数 (fps)不是比特率。你的想法是对的。只有一张静止图像 1 fps 不会有问题。
对于 mp4 来说,这个尺寸合理吗?图像尺寸很重要吗?
在这种情况下,图像大小不会有太大影响,因为我们只处理一张静态图片。如果是高质量视频,那么问题就大了。
我是否应该将 jpg 的大小调整为 1080 * 720,并在 ffmpeg 中进行其他设置以输出为 720p(那么 ffmpeg 的设置是什么:)?
您所说的分辨率是1280x720。
我看不出这个-loop 1
选项有什么意义,它只会减慢进程。你使用这个选项-shortest
是因为文件有多个输入流吗?如果没有,那么就没有理由使用它。既然你使用了,-acodec copy
我不得不假设你不想重新编码它。
对于无需重新编码且不改变比特率的 720p 1fps 输出:
ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4
假设它有多个输入流,并且您希望 ffmpeg 在最短的流处完成编码,那么:
ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4
现在如果您必须改变比特率(假设为 1024k 作为示例);
ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4
看:限制输出比特率
-c:副本= 复制输入音频流,以便我们无需重新编码。
-b:v= 指定为(不精确地)恒定的比特率。
-缓冲区大小= 计算平均比特率的间隔。这意味着根据指定的最低损失质量图像但更准确的比特率-b:v。
-s= 视频输出的实际尺寸。
-帧率= 我们希望输出使用的输入帧速率。
请注意,如果您仍然想要更小尺寸的视频,则必须牺牲质量才能实现这一目标。其他方法包括使用有损压缩重新编码。
从您所说的内容、您提供的信息以及您要执行的操作来看,我认为您的目标是将专辑封面嵌入 mp3。如果这是您的目标,那么这将更适合您的要求:
ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3
-map_元数据= ffmpeg 元数据说明符,用于从 infile 输出文件。在本例中(零) 全局元数据。
-地图 0= 输入流 1(音频)。
-地图 1= 输入流 2(图像)。
如果这里没有任何内容符合您的要求,请提供更多信息。