使用 FFmpeg 合并 1 幅图像 + 1 个音频

使用 FFmpeg 合并 1 幅图像 + 1 个音频

我想将一个音频文件和一个图像文件合并成一个视频。输出将采用.webm格式,因此我将使用libvpx。视频必须有一帧具有最佳/无损质量。

到目前为止我已经尝试过这些,但结果很糟糕或者根本没有结果:

第一个命令:

ffmpeg -i image.jpg -i audio.ogg -c:v copy -c:a copy outputvideo.webm

这不起作用。它给出以下错误:

[webm @ 0000000002c7f8a0] Only VP8 or VP9 video and Vorbis or Opus audio and Web
VTT subtitles are supported for WebM.
...
Could not write header for output file #0 (incorrect codec parameters ?): Error
number -22 occurred

第二条命令:

ffmpeg -i image.jpg -i audio.ogg -c:v libvpx -c:a copy outputvideo.webm

这会产生很差的质量,我无法接受。

第三条命令:

ffmpeg -i image.jpg -i audio.ogg -c:v libvpx -crf 4 -c:a copy outputvideo.webm

所以我添加了-crf 4参数。我期望这会产生视觉上无损的视频。事实上,它根本没有效果。-crf 4-crf 63产生了相同的结果。

然后我尝试了类似的编解码器设置libvpx-vp9,但没有成功。甚至-lossless 1参数也无助于提高质量。

答案1

第一个命令:jpg 不包含 webm。 http://en.wikipedia.org/wiki/WebM

第二条命令:您可以-loop 1在inputfile前面使用,-shortest在inputfile后面使用。

ffmpeg -loop 1 -i image.jpg -i audio.ogg -shortest -c:v libvpx -c:a copy outputvideo.webm

如果你想设置 fps,使用fps 过滤器

ffmpeg -loop 1 -i image.jpg -i audio.ogg -vf fps=10 -shortest -c:v libvpx -c:a copy outputvideo.webm

第三个命令:您可以使用质量最佳。 http://ffmpeg.org/ffmpeg-codecs.html#libvpx

ffmpeg -loop 1 -i image.jpg -i audio.ogg -shortest -c:v libvpx -quality best -c:a copy outputvideo.webm

答案2

我不确定这是否是一个错误,但使用-qscale:v而不是 可以-crf适用于 libvpx。Qscale 的工作方式与 CRF 相反,值越高表示质量越好。尝试使用-qscale:v 10而不是-crf选项的第二个命令。

答案3

ffmpeg -i image.jpg -i audio.ogg -c:v libvpx -crf 4 -c:a copy outputvideo.webm

所以我添加了 -crf 4 参数。我期望这会产生视觉上无损的视频。事实上,它根本没有效果。-crf 4 和 -crf 63 产生相同的结果。

然后我尝试了 libvpx-vp9 编解码器的类似设置,但没有成功。甚至 -lossless 1 参数也无助于提高质量。

为了获得无损质量,请尝试-b:v 0在使用 VP9 时添加,假设您的 .jpg 具有标准视频分辨率大小或您希望输出视频的精确分辨率,即 1080p 视频输出的 1920x1080 .jpg,并且颜色的动态范围有限。

ffmpeg -r 1 -loop 1 -i image.jpg -i audio.ogg -c:a copy -r 1 -c:v libvpx-vp9 -crf 0 -b:v 0 -shortest outputvideo.webm

注释/说明:

虽然我读过关于如何使视频流至少是 .jpg 大小的两倍且质量较低的评论-loop-shortest但通过将视频和音频文件的帧速率设置为 1,可以部分解决此问题。因此为什么-r 1要设置两次,一次用于视频,一次用于音频。然而,这也会增加您的编码时间。

虽然文件这么大似乎有些荒唐,但你已经设定了无损质量的标准,这要求不进行任何压缩。在视频压缩编解码器的工作原理是删除未压缩帧的相似之处,只保留差异,然后以压缩格式编码这些差异。通过创建无损视频文件,你基本上是在告诉编码器不是对这些帧进行任何压缩,从而相当于将 .jpg 文件复制到文件夹中 25 次(使用 时的默认帧-loop 1),每秒钟的视频。对于长音频文件,你可以想象 25x 200kb 的 .jpg 变成每秒 5MB 和每分钟 300 MB。因此,对于无损视频,最好的选择是使用我建议的命令认为的每秒 1 帧。如果文件大小太大,则将质量级别更改为 31 或设置-cfr 31

至于为什么质量更差,我没有足够的信息来具体说明(ffmpeg 的版本,.jpeg 的分辨率),但可能是因为你在运行 ffmpeg 时没有设置任何缩放选项,并且导致它应用默认的有限动态范围(16-235) 为颜色,将抖动设置为自动,并使用双三次算法进行缩放。因此,如果您的图像具有 0-255 的完整动态范围,那么这就解释了为什么无论-crf您之前设置的值是什么,图像质量都不会得到任何改善,因为它可能会删除有限动态范围配置文件所没有的少量颜色。

由于您在命令 3 中指出,您已成功创建视频而不使用循环选项,因此您可能想尝试省略和的使用,-loop-shortest使用命令 3 中之前使用过的所有相同参数,但然后指定一些缩放选项看看结果如何。

命令解释

  • 的有效值-crf实际上是 0-63,而如果“0”生成的文件太大,您仍然可以使用 4 来降低文件大小。不用说,推荐使用 VP9当使用 CQ 模式进行视频点播时,1080p 的目标质量为 33。
  • 通过-b:v 0将视频比特率标记为 0,明确设置“Q”模式,量化器可以确定要处理的数据流,这意味着量化器将使用尽可能多的比特率来维持指定的质量目标。但是...
  • ...我们没有指定目标质量,-quality因为默认值是“好”,并且据说这里“最佳”的目标水平更像是一种研究工具,比-quality good目标水平略有改善
  • 特意使用-r 1两次是为了通过将视频和音频的帧速率都设置为 1 来确保整个视频中都显示图像(如前所述)

答案4

您可以尝试通过手动设置视频比特率来获得质量-b:v 2000M

至于 FPS,似乎它对尺寸影响不大。

对 -b:v 和帧速率进行了一些实验:

ffmpeg -loop 1 -i ./frames/0254.png -i camera-shutter-click-07.wav -r 10000 -pix_fmt yuv420p -shortest -vcodec libvpx -strict -2 -acodec vorbis  outputvideo6.webm

ffmpeg -loop 1 -i ./frames/0254.png -i camera-shutter-click-07.wav -pix_fmt yuv420p -shortest -vcodec libvpx -strict -2 -acodec vorbis  outputvideo5.webm

ffmpeg -loop 1 -i ./frames/0254.png -i camera-shutter-click-07.wav -r 10000 -pix_fmt yuv420p -shortest -b:v 2000M -vcodec libvpx -strict -2 -acodec vorbis  outputvideo7.webm

前两个视频分别为 25fps 和 10000fps,但它们的文件大小几乎相等:101.3 和 102.7kB,但由于第三个比特率更高,因此它的大小为 339.7kB

ffmpeg -i outputvideo5.webm -i outputvideo6.webm -i outputvideo7.webm
ffmpeg version 2.5.git Copyright (c) 2000-2015 the FFmpeg developers
  built on Jan 11 2015 19:12:34 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
  configuration: --prefix=/home/alexandrov/ffmpeg_build --extra-cflags=-I/home/alexandrov/ffmpeg_build/include --extra-ldflags=-L/home/alexandrov/ffmpeg_build/lib --bindir=/home/alexandrov/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-x11grab
  libavutil      54. 16.100 / 54. 16.100
  libavcodec     56. 20.100 / 56. 20.100
  libavformat    56. 18.100 / 56. 18.100
  libavdevice    56.  3.100 / 56.  3.100
  libavfilter     5.  7.100 /  5.  7.100
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, matroska,webm, from 'outputvideo5.webm':
  Metadata:
    encoder         : Lavf56.18.100
  Duration: 00:00:01.32, start: 0.000000, bitrate: 613 kb/s
    Stream #0:0: Video: vp8, yuv420p, 1280x720, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 1k tbn, 1k tbc (default)
    Stream #0:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
Input #1, matroska,webm, from 'outputvideo6.webm':
  Metadata:
    encoder         : Lavf56.18.100
  Duration: 00:00:01.30, start: 0.000000, bitrate: 631 kb/s
    Stream #1:0: Video: vp8, yuv420p, 1280x720, SAR 1:1 DAR 16:9, 10k fps, 25 tbr, 1k tbn, 1k tbc (default)
    Stream #1:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)
Input #2, matroska,webm, from 'outputvideo7.webm':
  Metadata:
    encoder         : Lavf56.18.100
  Duration: 00:00:01.30, start: 0.000000, bitrate: 2088 kb/s
    Stream #2:0: Video: vp8, yuv420p, 1280x720, SAR 1:1 DAR 16:9, 10k fps, 25 tbr, 1k tbn, 1k tbc (default)
    Stream #2:1: Audio: vorbis, 48000 Hz, stereo, fltp (default)

相关内容