我正在尝试向从 YouTube 获取的 FLV 文件添加叠加层。输入文件为 4.4MB,可通过 QuickTime 播放,因此似乎没有任何问题。
ffmpeg -i input.flv -vf drawtext="fontfile='arial.ttf':text='hello':fontsize=9" output.flv
Run Code Online (Sandbox Code Playgroud)
几秒钟后,我收到了以下输出:
ffmpeg version 1.2.1 Copyright (c) 2000-2013 the FFmpeg developers
built on May 15 2013 13:13:12 with Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libspeex --enable-libfreetype --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid
libavutil 52. 18.100 / 52. 18.100
libavcodec 54. 92.100 / 54. 92.100
libavformat 54. 63.104 / 54. 63.104
libavdevice 54. 3.103 / 54. 3.103
libavfilter 3. 42.103 / 3. 42.103
libswscale 2. 2.100 / 2. 2.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 2.100 / 52. 2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.flv':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2010-01-31 13:44:29
Duration: 00:02:20.85, start: 0.000000, bitrate: 249 kb/s
Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 22050 Hz, mono, fltp, 56 kb/s
Metadata:
creation_time : 2010-01-31 13:44:29
handler_name : (C) 2007 Google Inc. v08.13.2007.
Stream #0:1(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 191 kb/s, 29.84 fps, 29.97 tbr, 30k tbn, 29.97 tbc
Metadata:
creation_time : 2010-01-31 13:44:29
handler_name : (C) 2007 Google Inc. v08.13.2007.
File 'output.flv' already exists. Overwrite ? [y/N] y
Output #0, flv, to 'output.flv':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
encoder : Lavf54.63.104
Stream #0:0(und): Video: flv1 ([2][0][0][0] / 0x0002), yuv420p, 320x240 [SAR 1:1 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 29.97 tbc
Metadata:
creation_time : 2010-01-31 13:44:29
handler_name : (C) 2007 Google Inc. v08.13.2007.
Stream #0:1(und): Audio: mp3 ([2][0][0][0] / 0x0002), 22050 Hz, mono, fltp
Metadata:
creation_time : 2010-01-31 13:44:29
handler_name : (C) 2007 Google Inc. v08.13.2007.
Stream mapping:
Stream #0:1 -> #0:0 (mpeg4 -> flv)
Stream #0:0 -> #0:1 (aac -> libmp3lame)
Press [q] to stop, [?] for help
frame= 4201 fps=1386 q=10.0 Lsize= 4304kB time=00:02:20.85 bitrate= 250.3kbits/s
video:3603kB audio:550kB subtitle:0 global headers:0kB muxing overhead 3.618454%
Run Code Online (Sandbox Code Playgroud)
现在,QuickTime 无法播放 output.flv,并且 Flash 抱怨不支持音频编解码器。唯一能够成功播放它的程序是 VLC。它的文件大小与 input.flv 相同。这可能是什么原因,哪些选项可以产生可玩的副本?
更新
使用各种编码器收到的截断输出:
ffmpeg -i input.flv -c:v libxvid -c:a copy -q:v 5 output2.flv
...
Stream mapping:
Stream #0:1 -> #0:0 (mpeg4 -> libxvid)
Stream #0:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 4201 fps=303 q=5.0 Lsize= 6597kB time=00:02:20.85 bitrate= 383.7kbits/s
video:5491kB audio:968kB subtitle:0 global headers:0kB muxing overhead 2.120003%
ffmpeg -i input.flv -c:v mpeg4 -c:a copy -q:v 5 output3.flv
...
Stream mapping:
Stream #0:1 -> #0:0 (mpeg4 -> mpeg4)
Stream #0:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 4201 fps=2523 q=5.0 Lsize= 6852kB time=00:02:20.85 bitrate= 398.5kbits/s
video:5746kB audio:968kB subtitle:0 global headers:0kB muxing overhead 2.044082%
ffmpeg -i input.flv -c copy outputcopy.flv
...
Stream mapping:
Stream #0:1 -> #0:0 (copy)
Stream #0:0 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 4201 fps=0.0 q=-1.0 Lsize= 4394kB time=00:02:20.85 bitrate= 255.6kbits/s
video:3289kB audio:968kB subtitle:0 global headers:0kB muxing overhead 3.216934%
Run Code Online (Sandbox Code Playgroud)
获取这些文件中的任何一个的信息会给我很多以下类型的错误(其中 n 是递增的整数):
- Stream discovered after head already parsed
- header damaged
- max_analyze_duration 5000000 reached at 5014000 microseconds
- Could not find codec parameters for stream n (Video: mpeg4, yuv420p): unspecified size
Consider increasing the value for the 'analyzeduration' and 'probesize' options
- decoding for stream n failed
Run Code Online (Sandbox Code Playgroud)
随后是以下类型的消息:
Stream #0:n: Video: mpeg4, yuv420p, 1k tbr, 1k tbn
Run Code Online (Sandbox Code Playgroud)
我刚刚通过 MacPorts 升级了 ffmpeg 及其依赖项,但仍然不走运。我从 YouTube 和其他地方尝试过的每个 FLV 文件都会发生这种情况。
根据规范,Flash Video 仅原生支持 VP-6 和 H.264 视频等。这意味着您将不得不坚持使用 FFmpeg 的flv
编码器,或者您使用编码器切换到 H.264 libx264
–有关您可以使用的选项,请参阅x264 编码指南:
ffmpeg -i input.flv … -c:v libx264 output.flv
Run Code Online (Sandbox Code Playgroud)
因此,您不能使用 MPEG-4 Part 2 编码器mpeg4
或libxvid
,因为它们仅在基于 libavformat 的播放器中受支持,其中包括从 Android 手机到 VLC 的任何内容,但——当然——不包括 QuickTime。
至于 QuickTime,它不正式支持 FLV。不幸的是,假设 QuickTime 不能播放所有文件是完全合理的。安装Perian(现在 EOL)应该让它播放一些FLV 文件,但不是全部。
就像规范所预测的那样,我只能使用在 中flv
调用的编码器ffmpeg
(即 Sorenson Spark H.263 编解码器和libx264
编码器)来播放 FLV 文件。
FLV 支持 MP3 和 AAC,所以我不知道 Flash 抱怨那里的编解码器无效是怎么回事。您可能想尝试使用 AAC 编码器:
ffmpeg -i input.flv … -c:a aac -strict experimental output.flv
Run Code Online (Sandbox Code Playgroud)
...或使用您的版本支持的任何其他 AAC 编码器。