制作精确的 mp4 (H264) 格式以上传到 youtube

WHI*_*LOR 7 youtube ffmpeg

使用 ffmpeg,我将视频从 mp3 和图片转换为上传到 youtube。上传后,转换失败。原因不明。我相信问题出在格式上。顺便说一句,如果我上传的文件长度为 5 分钟,如果我上传该文件的 30 秒它会成功,则它会失败。

我从 youtube 上下载了 mp4 文件。然后我上传了它,它完成得非常快。因此,一个不错的解决方案是将视频转换为与 google 相同的格式。

我通过 mpeg 得到以下输出:

ffmpeg version N-44264-g070b0e1 Copyright (c) 2000-2012 the FFmpeg developers
  built on Sep  7 2012 17:38:57 with gcc 4.7.1 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-pthreads --enable-runt
ime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libass -
-enable-libcelt --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-l
ibfreetype --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libopenj
peg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheo
ra --enable-libutvideo --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-li
bvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --ena
ble-zlib
  libavutil      51. 72.100 / 51. 72.100
  libavcodec     54. 55.100 / 54. 55.100
  libavformat    54. 25.105 / 54. 25.105
  libavdevice    54.  2.100 / 54.  2.100
  libavfilter     3. 16.100 /  3. 16.100
  libswscale      2.  1.101 /  2.  1.101
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'youtubetrack0.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2012-10-02 22:58:57
  Duration: 00:06:46.66, start: 0.000000, bitrate: 176 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yu
v420p, 450x360, 78 kb/s, 6 fps, 6 tbr, 12 tbn, 12 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 95
kb/s
    Metadata:
      creation_time   : 2012-10-02 22:58:57
      handler_name    : IsoMedia File Produced by Google, 5-11-2011
Run Code Online (Sandbox Code Playgroud)

是否可以构造 ffmpeg 参数,以便提供与谷歌内部相同的格式?以上信息是否足够?

我无法构建所需的参数。

例如,我不明白如何设置 tbn 以及“Stream #0:1(und): Audio:”中的 95 kb/s 是什么意思。

现在我只做:ffmpeg -i videoimage.jpg -i audio.mp3 video.mp4

我得到的信息:

ffmpeg version N-44998-gdf82454 Copyright (c) 2000-2012 the FFmpeg developers
  built on Oct  2 2012 23:03:12 with gcc 4.7.1 (GCC)
  configuration: --disable-static --enable-shared --enable-gpl --enable-version3
 --disable-pthreads --enable-runtime-cpudetect --enable-avisynth --enable-bzlib
--enable-frei0r --enable-libass --enable-libcelt --enable-libopencore-amrnb --en
able-libopencore-amrwb --enable-libfreetype --enable-libgsm --enable-libmp3lame
--enable-libnut --enable-libopenjpeg --enable-librtmp --enable-libschroedinger -
-enable-libspeex --enable-libtheora --enable-libutvideo --enable-libvo-aacenc --
enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enab
le-libxavs --enable-libxvid --enable-zlib
  libavutil      51. 73.101 / 51. 73.101
  libavcodec     54. 63.100 / 54. 63.100
  libavformat    54. 29.105 / 54. 29.105
  libavdevice    54.  3.100 / 54.  3.100
  libavfilter     3. 19.102 /  3. 19.102
  libswscale      2.  1.101 /  2.  1.101
  libswresample   0. 16.100 /  0. 16.100
  libpostproc    52.  1.100 / 52.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf54.25.105
  Duration: 00:06:46.81, start: 0.000000, bitrate: 129 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuvj420p, 450x360,
 3392 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 127
 kb/s
    Metadata:
      handler_name    : SoundHandler
Run Code Online (Sandbox Code Playgroud)

该视频在 youtube 上转换失败。

我还尝试使用其他 vcode parmam 和输出文件的扩展名(mp4、wmv、avi),但也失败了。

将非常有帮助。

小智 9

这些选项对我有用,例如:上传后,YouTube 不会对视频进行进一步处理/重新编码。

ffmpeg -i SOURCE -c:v libx264 -flags:v "+cgop" -g 15 -bf 1 -coder ac -profile:v high -crf 25 -pix_fmt yuv420p -c:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart OUTPUT.mp4
Run Code Online (Sandbox Code Playgroud)

您可能想尝试-bf 2而不是 1,但它导致在我的测试中重新编码。为了获得更高的视频质量,降低 -crf 设置,通常 20-28 是推荐范围,较低的值产生更高的质量。我还没有尝试过两次编码,cbr 或 abr,但它应该可以工作。您还可以将音频降低到 192k 比特率。

重要提示:请注意,您需要将其设置-g X为帧速率的一半。在这个例子中,我正在编码一个 30fps 的视频,所以我将 GOP 设置为 15。如果您的源是 24fps,则将其设置为 12,如果是 60fps,则将其设置为 30。

我知道这是一个老问题,但是当您搜索“youtube 的 ffmpeg 选项”时,这是 Google 上的第一个结果。

编辑:我从https://www.virag.si/2015/06/encoding-videos-for-youtube-with-ffmpeg/得到这些选项


slh*_*hck 8

YouTube 应该能够使用您提供给它的几乎所有内容。无论您提供何种确切格式,它都将始终对您的视频进行转码——例如,因为它需要为您的视频提供不同的分辨率或其他容器(如 FLV 或 WebM),即使它在上传时位于 MP4 容器中。

为 YouTube 制作视频的基本命令是:

ffmpeg -i input.avi -c:v libx264 -c:a aac -strict experimental -b:a 192k out.mp4
Run Code Online (Sandbox Code Playgroud)

您只需要更改质量,并最终更改帧速率-r和视频大小-s:v以匹配高级编码规范,因此您的视频不是柱状或信箱状(即带有黑色边框)。

有关 FFmpeg 的更多选项和一般介绍,请阅读我们的博客条目:FFmpeg:终极视频和音频操作工具


但是您正在创建一个包含一个循环图像的视频,因此您需要告诉 FFmpeg 在-loop 1指定的时间内循环图像-t,例如 5 分钟:

ffmpeg -loop 1 -f image2 -i image.jpg -c:v libx264 -t 00:05:00.000 out.mp4
Run Code Online (Sandbox Code Playgroud)

对于音频流,只需添加第二个-i参数:

ffmpeg -loop 1 -f image2 -i image.jpg -i audio.mp3 -c:v libx264 -c:a aac -strict experimental -b:a 192k -t 00:05:00.000 out.mp4
Run Code Online (Sandbox Code Playgroud)

然后 FFmpeg 将自动映射流,将您的图像映射到 h.264 视频并将您的音频映射到 AAC:

Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg -> libx264)
  Stream #1:0 -> #0:1 (mp3 -> aac)
Run Code Online (Sandbox Code Playgroud)

该视频应与 YouTube 兼容,帧速率为 25。如果您想更改它,请使用-r并设置另一个帧速率。我已经成功地以 1 的帧速率将视频上传到 YouTube - 因为如果您只有一张图像和背景循环中的音轨并不重要。