使用 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/得到这些选项
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 - 因为如果您只有一张图像和背景循环中的音轨并不重要。