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

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

使用 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

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

我无法构建所需的参数。

例如,我不明白如何设置 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

该视频在 YouTube 上转换失败。

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

如果能得到帮助我将非常感激。

答案1

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

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

ffmpeg -i input.avi -c:v libx264 -c:a aac -strict experimental -b:a 192k out.mp4

你只需要改变质量,最终改变帧速率-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

对于音频流,只需添加第二个-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

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

Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg -> libx264)
  Stream #1:0 -> #0:1 (mp3 -> aac)

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

答案2

这些选项对我来说很有用,例如:视频上传后不会经过 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

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

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

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

编辑:我从以下位置获得了这些选项https://www.virag.si/2015/06/encoding-videos-for-youtube-with-ffmpeg/

相关内容