图片+音频= mp4:如何缩小视频尺寸?


12

我正在使用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 = 8060万(视频结果不太清楚,音乐效果仍然不错)

MP4尺寸合适吗?


我想知道是否有可能将meta mp4播放成仅播放mp3并将屏幕固定在一个jpg上以节省尺寸的方法:)
SIDU

输出的目标播放器,设备或站点是什么?
llogan'1

我正在尝试将.mp4上传到Youtube.com
SIDU

Answers:


18

用于上传到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 Wiki:H.264


您能否提供一行代码,使1280 * 720中的a.jpg + a.mp3 = a.mp4,YouTube允许的最低帧/秒?另外,由于只有一项工作,我是否需要删除“ -loop 1”?提前致谢。
SIDU

@SIDU现有命令可以满足您的要求(除了输出MKV而不是MP4之外),但是我不知道YouTube支持的最低帧频。您只需要试验。刚上传到YouTube时为什么需要MP4?
llogan

我尝试过,但它说:Unrecognized option 'preset'. Error splitting the argument list: Option not found
NineCattoRules'3

@NineCattoRules如果没有更多信息,很难说。使用pastebin网站显示完整的ffmpeg命令以及该命令的完整控制台输出,然后在注释中提供链接。
llogan

谢谢,我使用mc3man信息库重新安装了FFMPEG,现在运行良好!
NineCattoRules's

3

仅凭您提供的信息,我就能想到。

让我们逐个进行:

由于仅在视频中添加了一张图像。我想知道是否有减小视频大小的方法,例如强制比特率/秒= 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:a复制 =复制输入音频流,因此我们不会重新编码。

-b:v =指定为(不精确)恒定的比特率。

-bufsize =它是计算平均比特率的时间间隔。根据-b:v中的指定,这意味着最低的损失质量更好的图像,但比特率更准确。

-s =视频输出的实际大小。

-framerate =我们希望输出使用的输入帧速率。

请注意,如果您仍然希望在某一时刻获得较小尺寸的视频,则必须牺牲质量才能实现这一点。其他实现方法包括使用有损压缩进行重新编码。

从您所说的内容来看,您提供的信息以及您正在尝试做的事情,我认为您的目标似乎是将专辑封面嵌入mp3。如果这是您的目标,那么它将更适合您的要求:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata =从infile输出文件的ffmpeg元数据说明符。在这种情况下()是全局元数据。

-map 0 =输入流1(音频)。

-map 1 =输入流2(图像)。

如果此处没有适合您的要求,请提供更多信息。


考虑将其-framerate用作输入选项并删除输出-r:否则,将使用默认的输入帧速率25,然后ffmpeg丢弃帧以实现-r 1。如果仅声明输入帧速率,则输出将使用相同的帧速率。
llogan'1

谢谢。不知道 编辑以反映建议的更改。
Fenrir'1

感谢您的教程。我的origianl ffmpeg代码行是Google搜索的复制粘贴,我不知道这是什么。
SIDU
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.