我使用以下命令,它适用于大多数文件,除了似乎是 xvid 编码的文件
/usr/bin/ffmpeg -sameq -i file.avi -ss 00:01:00 -t 00:00:30 -ac 2 -r 25 -copyts output.avi
因此,这基本上应该从 1 分钟标记开始拼接出 30 秒的视频 + 音频。
它确实在 00:01:00 标记处开始编码,但由于某种原因,它会一直到文件末尾,而忽略了我只想要 30 秒。
输出如下所示。
FFmpeg version git-ecc4bdd, Copyright (c) 2000-2010 the FFmpeg developers
built on May 31 2010 04:52:24 with gcc 4.4.3 20100127 (Red Hat 4.4.3-4)
configuration: --enable-libx264 --enable-libxvid --enable-libmp3lame --enable-libopenjpeg --enable-libfaac --enable-libvorbis --enable-gpl --enable-nonfree --enable-libxvid --enable-pthreads --enable-libfaad --extra-cflags=-fPIC --enable-postproc --enable-libtheora --enable-libvorbis --enable-shared
libavutil 50.15. 2 / 50.15. 2
libavcodec 52.67. 0 / 52.67. 0
libavformat 52.62. 0 / 52.62. 0
libavdevice 52. 2. 0 / 52. 2. 0
libavfilter 1.20. 0 / 1.20. 0
libswscale 0.10. 0 / 0.10. 0
libpostproc 51. 2. 0 / 51. 2. 0
[mpeg4 @ 0x17cf770]Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'file.avi':
Metadata:
ISFT : VirtualDubMod 1.5.10.2 (build 2540/release)
Duration: 00:02:00.00, start: 0.000000, bitrate: 1587 kb/s
Stream #0.0: Video: mpeg4, yuv420p, 672x368 [PAR 1:1 DAR 42:23], 25 tbr, 25 tbn, 25 tbc
Stream #0.1: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s
File 'lol6.avi' already exists. Overwrite ? [y/N] y
Output #0, avi, to 'lol6.avi':
Metadata:
ISFT : Lavf52.62.0
Stream #0.0: Video: mpeg4, yuv420p, 672x368 [PAR 1:1 DAR 42:23], q=2-31, 200 kb/s, 25 tbn, 25 tbc
Stream #0.1: Audio: mp2, 48000 Hz, 2 channels, s16, 64 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
Press [q] to stop encoding
[mpeg4 @ 0x17cf770]Invalid and inefficient vfw-avi packed B frames detected
[buffer @ 0x184b610]Buffering several frames is not supported. Please consume all available frames before adding a new one.
frame= 1501 fps=104 q=0.0 Lsize= 15612kB time=30.02 bitrate=4259.7kbits/s ts/s
video:15303kB audio:235kB global headers:0kB muxing overhead 0.482620%
例如,如果我将此文件转换为 mp4,然后执行相同的操作,它可以完美运行。
答案1
我假设您的“转换为 MP4”操作只是容器更改,而不是 A/V 数据流的完整重新编码。因此,也许 FFmpeg 在这些 AVI 容器中遇到了一些问题。输出中的这一行可能支持这一点:
[mpeg4 @ 0x17cf770]检测到无效且低效的 vfw-avi 打包 B 帧
您可以尝试创建一个新的 AVI 容器——让 FFmpeg 复制整个文件,例如:
ffmpeg -i input.avi -vcodec copy -acodec copy output.avi
这应该会创建一个新的 AVI 容器并复制数据流。然后再次尝试您的命令。如果它有效,则您的 AVI 已损坏(或可能是 FFmpeg 错误)——无论哪种方式,您都可以将所有视频放入新的 AVI 容器中并以此方式完成。
如果这不起作用,您可以进一步研究损坏的 XviD 并看看它们有什么共同点。
答案2
不知道你的问题是否和这篇文章一样:
转换任何适用于 iPod 或 iPhone 的视频文件
您想使用新款 Apple iPod Video 或 Apple iPhone,但不知道如何转换视频以便播放。
由于许可问题,Ubuntu 9.10(Karmic Koala)附带的 ffmpeg 版本不支持 libfaac。这意味着您需要自己编译 ffmpeg。本指南将介绍如何操作。
本文逐步讲解了如何手动编译 ffmpeg 或创建修改后的 ffmpeg 包,其中包含 libfaac 以支持高级音频编码(AAC)。