![制作精确的 mp4 (H264) 格式以便上传到 YouTube](https://linux22.com/image/1332105/%E5%88%B6%E4%BD%9C%E7%B2%BE%E7%A1%AE%E7%9A%84%20mp4%20(H264)%20%E6%A0%BC%E5%BC%8F%E4%BB%A5%E4%BE%BF%E4%B8%8A%E4%BC%A0%E5%88%B0%20YouTube.png)
使用 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 2
1 而不是 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/