目录
- 1 一般问题
- 2 编译
- 3 用法
- 3.1 ffmpeg 不工作;哪里出错了?
- 3.2 如何将单张图片编码为视频?
- 3.3 如何将视频编码为单张图片?
- 3.4 为什么我在使用多线程 MPEG* 编码时会看到轻微的质量下降?
- 3.5 如何从标准输入读取或写入标准输出?
- 3.6 -f jpeg 不起作用。
- 3.7 为什么我不能更改帧率?
- 3.8 如何用 ffmpeg 编码 Xvid 或 DivX 视频?
- 3.9 编码高质量 MPEG-4 的好参数是什么?
- 3.10 编码高质量 MPEG-1/MPEG-2 的好参数是什么?
- 3.11 用 ffmpeg 编码隔行扫描视频看起来很糟糕,哪里出错了?
- 3.12 如何读取 DirectShow 文件?
- 3.13 如何连接视频文件?
- 3.14 如何拼接视频文件?
- 3.15 使用 -f lavfi,音频无缘无故变成单声道。
- 3.16 为什么 FFmpeg 看不到我的 VOB 文件中的字幕?
- 3.17 为什么
ffmpeg
-sameq 选项被删除了?应该用什么代替? - 3.18 我有一个拉伸的视频,为什么缩放不能修复它?
- 3.19 如何在后台运行 ffmpeg?
- 3.20 如何防止 ffmpeg 以类似暂停(tty 输出)的消息暂停?
- 4 开发
- 4.1 是否有示例说明如何使用 FFmpeg 库,特别是 libavcodec 和 libavformat?
- 4.2 你们能支持我的 C 编译器 XXX 吗?
- 4.3 是否支持 Microsoft Visual C++?
- 4.4 你们能添加 automake、libtool 或 autoconf 支持吗?
- 4.5 为什么不使用面向对象的 C++ 重写 FFmpeg?
- 4.6 为什么 ffmpeg 程序没有调试符号?
- 4.7 我不喜欢 LGPL,我可以用 GPL 贡献代码吗?
- 4.8 我在我的 C 应用程序中使用 FFmpeg,但链接器抱怨库本身缺少符号。
- 4.9 我在我的 C++ 应用程序中使用 FFmpeg,但链接器抱怨缺少似乎可用的符号。
- 4.10 我在我的 C++ 应用程序中使用 libavutil,但编译器抱怨“UINT64_C”未在此作用域中声明
- 4.11 我在内存中有一个文件/一个不同于 *open/*read/libc 的 API,我如何在 libavformat 中使用它?
- 4.12 哪里有关于 ffv1、msmpeg4、asv1、4xm 的文档?
- 4.13 如何将 H.263-RTP(以及 RTP 中的其他编解码器)馈送到 libavcodec?
- 4.14 AVStream.r_frame_rate 是错误的,它远大于帧率。
- 4.15 为什么
make fate
不运行所有测试? - 4.16 为什么
make fate
找不到样本?
1 一般问题
1.1 为什么 FFmpeg 不支持 [xyz] 功能?
因为还没有人承担这项任务。FFmpeg 的开发是由各个开发者认为重要的任务驱动的。如果你有一个对你很重要的功能,实现它的最好方法是自己承担这项任务或赞助一个开发者。
1.2 FFmpeg 不支持编解码器 XXX。你们能包含一个 Windows DLL 加载器来支持它吗?
否。Windows DLL 不可移植、臃肿且通常速度较慢。此外,FFmpeg 努力原生支持所有编解码器。DLL 加载器不利于实现这个目标。
1.3 虽然这个格式似乎被 ffmpeg 支持,但我无法读取此文件。
即使 ffmpeg 可以读取容器格式,它也可能不支持其所有编解码器。请查阅 ffmpeg 文档中支持的编解码器列表。
1.4 Windows 支持哪些编解码器?
除非你安装了一些额外的编解码器,否则 Windows 对 MPEG 等标准格式的支持不太好。
以下视频编解码器列表应在大多数 Windows 系统上工作
- msmpeg4v2
.avi/.asf
- msmpeg4
仅 .asf
- wmv1
仅 .asf
- wmv2
仅 .asf
- mpeg4
仅当安装了 ffdshow 或 Xvid 等 MPEG-4 编解码器时。
- mpeg1video
仅 .mpg
请注意,ASF 文件在 Windows 中通常带有 .wmv 或 .wma 扩展名。还应该提到的是,微软声称拥有 ASF 格式的专利,可能会起诉或威胁使用非微软软件创建 ASF 文件的用户。强烈建议尽可能避免使用 ASF。
以下音频编解码器列表应在大多数 Windows 系统上工作
- adpcm_ima_wav
- adpcm_ms
- pcm_s16le
始终
- libmp3lame
如果安装了 LAME 等 MP3 编解码器。
2 编译
2.1 error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'
这是 gcc 中的一个错误。不要向我们报告。相反,请向 gcc 开发人员报告。请注意,我们不会为 gcc 错误添加解决方法。
还要注意,(一些)gcc 开发人员认为这不是一个错误,或者不是他们应该修复的错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203。再说一遍,他们中的一些人不知道不可判定问题和 NP 难题之间的区别...
2.2 我已经用我的发行版的包管理器安装了这个库。为什么 configure
看不到它?
发行版通常将库拆分为多个包。主包包含运行使用该库的程序所需的文件。开发包包含构建使用该库的程序所需的文件。有时,文档和/或数据也位于单独的包中。
要构建 FFmpeg,你需要安装开发包。它通常称为 libfoo-dev 或 libfoo-devel。你可以在构建完成后将其删除,但请务必保留主包。
2.3 如何让 pkg-config
找到我的库?
在你的库的某个地方,有一个 .pc 文件(或多个)在 pkgconfig 目录中。你需要设置环境变量来指示 pkg-config
这些文件。
如果你需要向 pkg-config
的搜索列表中添加目录(典型用例:单独安装的库),请将其添加到 $PKG_CONFIG_PATH
export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig
如果你需要替换 pkg-config
的搜索列表(典型用例:交叉编译),请在 $PKG_CONFIG_LIBDIR
中设置它
export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig
如果你需要知道库的内部依赖关系(典型用例:静态链接),请将 --static
选项添加到 pkg-config
./configure --pkg-config-flags=--static
2.4 交叉编译时如何使用 pkg-config
?
最好的方法是在你的交叉编译环境中安装 pkg-config
。它将自动使用交叉编译库。
你也可以通过显式地指定 --pkg-config=pkg-config
给 configure
来从主机环境中使用 pkg-config
。在这种情况下,你必须使用 PKG_CONFIG_LIBDIR
将 pkg-config
指向正确的目录,如前一个条目中所述。
作为中间解决方案,你可以在你的交叉编译环境中放置一个脚本,该脚本使用设置的 PKG_CONFIG_LIBDIR
调用主机 pkg-config
。该脚本可以如下所示
#!/bin/sh PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig export PKG_CONFIG_LIBDIR exec /usr/bin/pkg-config "$@"
3 用法
3.1 ffmpeg 不工作;哪里出错了?
在构建之前,尝试在 ffmpeg 源代码目录中执行 make distclean
。如果这没有帮助,请参阅 (https://ffmpeg.cpp.org.cn/bugreports.html)。
3.2 如何将单张图片编码为视频?
首先,将你的图片重命名为遵循数字序列。例如,img1.jpg、img2.jpg、img3.jpg,... 然后你可以运行
ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg
注意, ‘%d’ 会被替换为图像编号。
img%03d.jpg 表示序列 img001.jpg、img002.jpg 等。
使用 -start_number 选项来声明序列的起始编号。如果你的序列不是从 img001.jpg 开始,但仍然是数字顺序,这将非常有用。以下示例将从 img100.jpg 开始。
ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg
如果你有大量的图片需要重命名,可以使用以下命令来减轻负担。该命令使用 bourne shell 语法,将当前目录下所有匹配 *jpg
的文件以符号链接的形式链接到 /tmp 目录,并按照 img001.jpg、img002.jpg 等顺序排列。
x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done
如果你想按照修改时间由旧到新的顺序排列,请将 *jpg
替换为 $(ls -r -t *jpg)
。
然后运行
ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
相同的逻辑适用于 ffmpeg 可以读取的任何图像格式。
你也可以使用 cat
将图像管道传输给 ffmpeg
cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg
3.3 如何将视频编码为单张图片?
使用
ffmpeg -i movie.mpg movie%d.jpg
作为输入的 movie.mpg 将被转换为 movie1.jpg、movie2.jpg 等。
除了依赖文件格式的自动识别,你也可以使用
- -c:v ppm
- -c:v png
- -c:v mjpeg
来强制编码。
将上述方法应用于之前的示例
ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg
请注意,没有 "jpeg" 编解码器。请改用 "mjpeg"。
3.4 为什么我在使用多线程 MPEG* 编码时会看到轻微的质量下降?
对于多线程 MPEG* 编码,编码的切片必须是独立的,否则线程 n 实际上必须等待 n-1 完成,因此质量略有下降是合乎逻辑的。这不是一个错误。
3.5 如何从标准输入读取或写入标准输出?
使用 - 作为文件名。
3.6 -f jpeg 不起作用。
尝试 ’-f image2 test%d.jpg’。
3.7 为什么我不能更改帧率?
一些编解码器,如 MPEG-1/2,只允许少量固定的帧率。请使用 -c:v 命令行选项选择不同的编解码器。
3.8 如何用 ffmpeg 编码 Xvid 或 DivX 视频?
Xvid 和 DivX (4+) 都是 ISO MPEG-4 标准的实现(请注意,还有许多其他使用同一标准的编码格式)。因此,请使用 '-c:v mpeg4' 以这些格式进行编码。存储在 MPEG-4 编码文件中的默认 fourcc 将是 'FMP4'。如果你想要一个不同的 fourcc,请使用 '-vtag' 选项。例如,'-vtag xvid' 将强制将 fourcc 'xvid' 存储为视频 fourcc,而不是默认值。
3.9 编码高质量 MPEG-4 的好参数是什么?
'-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2',可以尝试的选项:'-bf 2'、'-mpv_flags qp_rd'、'-mpv_flags mv0'、'-mpv_flags skip_rd'。
3.10 编码高质量 MPEG-1/MPEG-2 的好参数是什么?
'-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2',但请注意 '-g 100' 可能会导致一些解码器出现问题。可以尝试的选项:'-bf 2'、'-mpv_flags qp_rd'、'-mpv_flags mv0'、'-mpv_flags skip_rd'。
3.11 用 ffmpeg 编码隔行扫描视频看起来很糟糕,哪里出错了?
对于隔行扫描素材,你应该使用 '-flags +ilme+ildct',也许可以使用 '-flags +alt',如果结果看起来很混乱,可以尝试 '-top 0/1'。
3.12 如何读取 DirectShow 文件?
如果你的 FFmpeg 是使用 ./configure --enable-avisynth
构建的(仅在 MinGW/Cygwin 平台上可用),那么你可以使用 DirectShow 可以读取的任何文件作为输入。
只需创建一个名为 "input.avs" 的文本文件,其中包含这一行...
DirectShowSource("C:\path to your file\yourfile.asf")
...然后将该文本文件馈送到 ffmpeg
ffmpeg -i input.avs
有关 AviSynth 的任何其他帮助,请访问 AviSynth 主页。
3.13 如何连接视频文件?
“连接”视频文件是相当模糊的。以下列表解释了不同类型的“连接”,并指出如何在 FFmpeg 中处理这些问题。连接视频文件可能意味着
- 将它们一个接一个地放置:这称为连接(简称:concat),并在 本 FAQ 中进行了说明。
- 将它们放在同一个文件中,让用户在不同版本之间进行选择(示例:不同的音频语言):这称为将它们多路复用在一起(简称:mux),只需使用多个 -i 选项调用 ffmpeg 即可完成。
- 对于音频,将所有通道放在一个流中(示例:将两个单声道流合并为一个立体声流):这有时称为合并它们,可以使用
amerge
过滤器来完成。 - 对于音频,将一个音频叠放在另一个音频之上播放:这称为混合它们,可以通过首先将它们合并为一个流,然后使用
pan
过滤器随意混合通道来实现。 - 对于视频,将两者同时显示,并排或一个在另一个的一部分之上;可以使用
overlay
视频过滤器来实现。
3.14 如何拼接视频文件?
有几种解决方案,具体取决于具体情况。
3.14.1 使用 concat 滤镜 拼接
FFmpeg 有一个专门为此设计的 concat
过滤器,文档中有示例。如果你需要重新编码,建议使用此操作。
3.14.2 使用 concat 解复用器 拼接
FFmpeg 有一个 concat
解复用器,当你想避免重新编码,并且你的格式不支持文件级别的连接时,可以使用它。
3.14.3 使用 concat 协议(文件级别)拼接
FFmpeg 有一个专门为此设计的 concat
协议,文档中有示例。
一些多媒体容器(MPEG-1、MPEG-2 PS、DV)允许通过简单地连接包含它们的文件来连接视频。
因此,你可以通过首先将你的多媒体文件转码为这些特权格式,然后使用简单的 cat
命令(或 Windows 下同样简单的 copy
),最后转码回你选择的格式来连接它们。
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
此外,你可以使用 concat
协议而不是 cat
或 copy
,这将避免创建可能巨大的中间文件。
ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
请注意,你可能需要转义字符 "|",它对于许多 shell 来说是特殊的。
另一种选择是使用命名管道,如果你的平台支持的话
mkfifo intermediate1.mpg mkfifo intermediate2.mpg ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null & ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null & cat intermediate1.mpg intermediate2.mpg |\ ffmpeg -f mpeg -i - -c:v mpeg4 -c:a libmp3lame output.avi
3.14.4 使用原始音频和视频拼接
类似地,yuv4mpegpipe 格式以及原始视频、原始音频编解码器也允许连接,并且转码步骤几乎是无损的。当使用多个 yuv4mpegpipe 时,除了第一个流之外,所有流的第一行都需要被丢弃。这可以通过管道传输 tail
来完成,如下所示。请注意,当通过 tail
管道传输时,你必须使用命令分组,{ ;}
,才能正确地在后台运行。
例如,假设我们想将两个 FLV 文件连接到一个 output.flv 文件中
mkfifo temp1.a mkfifo temp1.v mkfifo temp2.a mkfifo temp2.v mkfifo all.a mkfifo all.v ffmpeg -i input1.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null & ffmpeg -i input2.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null & ffmpeg -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null & { ffmpeg -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; } & cat temp1.a temp2.a > all.a & cat temp1.v temp2.v > all.v & ffmpeg -f u16le -c:a pcm_s16le -ac 2 -ar 44100 -i all.a \ -f yuv4mpegpipe -i all.v \ -y output.flv rm temp[12].[av] all.[av]
3.15 使用 -f lavfi,音频无缘无故变成单声道。
使用 -dumpgraph - 来找出通道布局丢失的确切位置。
最有可能的是通过 auto-inserted aresample
。尝试理解为什么在该位置需要转换过滤器。
输出之前是一个可能的位置,因为 -f lavfi 当前仅支持打包的 S16。
然后在过滤器图中显式插入正确的 aformat
,指定确切的格式。
aformat=sample_fmts=s16:channel_layouts=stereo
3.16 为什么 FFmpeg 看不到我的 VOB 文件中的字幕?
VOB 和一些其他格式没有描述文件中存在的所有内容的全局头。相反,应用程序应该扫描文件以查看它包含什么。由于 VOB 文件通常很大,因此只扫描开头部分。如果字幕恰好在文件的后面出现,它们最初将不会被检测到。
一些应用程序,包括 ffmpeg
命令行工具,只能处理在初始扫描期间检测到的流;稍后检测到的流将被忽略。
初始扫描的大小由两个选项控制:probesize
(默认 ~5 Mo)和 analyzeduration
(默认 5,000,000 µs = 5 s)。要检测到字幕流,这两个值都必须足够大。
3.17 为什么 ffmpeg
-sameq 选项被删除了?应该用什么代替?
-sameq 选项的含义是“相同的量化器”,仅在非常有限的情况下有意义。不幸的是,很多人误以为它的意思是“相同的质量”,并在不适用的地方使用它:它大致达到了预期的视觉效果,但实现方式非常低效。
每个编码器都有自己的一组选项来设置质量与大小之间的平衡,请使用您正在使用的编码器的选项,将质量级别设置为您喜欢的程度。最常见的选项是 -qscale 和 -qmax,但您应该仔细阅读所选编码器的文档。
3.18 我有一个拉伸的视频,为什么缩放不能修复它?
许多视频编解码器和格式可以存储视频的宽高比:这是完整图像(DAR,显示宽高比)或单个像素(SAR,采样宽高比)的宽度和高度之间的比率。例如,分辨率为 640×350 的 EGA 屏幕的 DAR 为 4:3,SAR 为 35:48。
大多数静态图像处理使用方形像素,即 1:1 SAR,但许多视频标准,特别是来自模拟数字过渡时代的标准,使用非方形像素。
FFmpeg 中的大多数处理滤镜都会处理宽高比以避免拉伸图像:裁剪会调整 DAR 以保持 SAR 不变,缩放会调整 SAR 以保持 DAR 不变。
如果要拉伸或“取消拉伸”图像,您需要使用 setdar 或 setsar 滤镜
来覆盖这些信息。
不要忘记仔细检查原始视频,以确认拉伸是来自图像还是来自宽高比信息。
例如,要修复一个编码不佳的 EGA 捕获,请使用以下命令,第一个命令可以向上缩放到方形像素,第二个命令可以设置正确的宽高比,或者第三个命令可以避免转码(可能无法工作,具体取决于格式/编解码器/播放器/月相)。
ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut
3.19 如何在后台运行 ffmpeg?
ffmpeg 通常会在执行操作时检查控制台输入,例如输入 "q" 停止和输入 "?" 获取帮助。 ffmpeg 没有办法检测它何时作为后台任务运行。当它检查控制台输入时,可能会导致在后台运行 ffmpeg 的进程暂停。
为了防止这些输入检查,从而允许 ffmpeg 作为后台任务运行,请在 ffmpeg 调用中使用 -nostdin
选项。无论您是在 shell 中运行 ffmpeg 还是通过操作系统 API 在其自己的进程中调用 ffmpeg,此选项都有效。
作为替代方案,当您在 shell 中运行 ffmpeg 时,您可以将标准输入重定向到 /dev/null
(在 Linux 和 macOS 上) 或 NUL
(在 Windows 上)。您可以在 ffmpeg 调用时进行此重定向,或者从调用 ffmpeg 的 shell 脚本中进行此重定向。
例如
ffmpeg -nostdin -i INPUT OUTPUT
或者 (在 Linux、macOS 和其他类 UNIX shell 上)
ffmpeg -i INPUT OUTPUT </dev/null
或者 (在 Windows 上)
ffmpeg -i INPUT OUTPUT <NUL
3.20 如何防止 ffmpeg 以类似暂停(tty 输出)的消息暂停?
如果您在后台运行 ffmpeg,您可能会发现其进程暂停。可能会出现类似suspended (tty output)的消息。问题是如何防止进程被暂停。
例如
% ffmpeg -i INPUT OUTPUT &> ~/tmp/log.txt & [1] 93352 % [1] + suspended (tty output) ffmpeg -i INPUT OUTPUT &>
尽管有 "tty output" 的消息,但这里的问题是 ffmpeg 通常在运行时会检查控制台输入。操作系统会检测到这一点,并暂停该进程,直到您可以将其带到前台并进行处理。
解决方案是使用正确的技术来告诉 ffmpeg 不要咨询控制台输入。您可以使用 -nostdin
选项,或者使用 < /dev/null
重定向标准输入。有关详细信息,请参阅 FAQ 如何将 ffmpeg 作为后台任务运行?
4 开发
4.1 是否有示例说明如何使用 FFmpeg 库,特别是 libavcodec 和 libavformat?
是的。请检查源代码存储库中的 doc/examples 目录,也可在以下网址在线获取:https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples。
默认情况下也会安装示例,通常在 $PREFIX/share/ffmpeg/examples
中。
您还可以阅读 FFmpeg 文档的开发人员指南。或者,查看许多已集成 FFmpeg 的开源项目之一的源代码(projects.html)。
4.2 你们能支持我的 C 编译器 XXX 吗?
这取决于情况。如果您的编译器符合 C99 标准,那么如果它们不会用与编译器相关的 #ifdef
污染源代码,则支持它的补丁很可能会受欢迎。
4.3 是否支持 Microsoft Visual C++?
是的。请参阅 FFmpeg 文档中的 Microsoft Visual C++ 部分。
4.4 你们能添加 automake、libtool 或 autoconf 支持吗?
不。这些工具过于臃肿,会使构建复杂化。
4.5 为什么不使用面向对象的 C++ 重写 FFmpeg?
FFmpeg 已经以高度模块化的方式组织,不需要用形式化的面向对象语言重写。此外,许多开发人员喜欢直接使用 C;这对他们来说很有效。有关此事的更多论点,请阅读 "Programming Religion"。
4.6 为什么 ffmpeg 程序没有调试符号?
构建过程会创建包含完整调试信息的 ffmpeg_g
、ffplay_g
等。这些二进制文件被剥离以创建 ffmpeg
、ffplay
等。如果需要调试信息,请使用 *_g 版本。
4.7 我不喜欢 LGPL,我可以用 GPL 贡献代码吗?
是的,只要代码是可选的,并且可以轻松干净地放在 #if CONFIG_GPL 下而不会破坏任何东西即可。因此,例如,一个新的编解码器或滤镜在 GPL 下是可以的,而对 LGPL 代码的错误修复则不行。
4.8 我在我的 C 应用程序中使用 FFmpeg,但链接器抱怨库本身缺少符号。
FFmpeg 默认构建静态库。在静态库中,依赖项未处理。这有两个后果。首先,您必须按依赖顺序指定库:-lavdevice
必须在 -lavformat
之前,-lavutil
必须在所有其他库之后,等等。其次,必须指定 FFmpeg 中使用的外部库。
获取所需库的完整列表并按依赖顺序排列的简单方法是使用 pkg-config
。
c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)
有关更多详细信息,请参阅 doc/example/Makefile 和 doc/example/pc-uninstalled。
4.9 我在我的 C++ 应用程序中使用 FFmpeg,但链接器抱怨缺少似乎可用的符号。
FFmpeg 是一个纯 C 项目,因此要在 C++ 应用程序中使用库,您需要显式声明您正在使用 C 库。您可以使用 extern "C"
包含您的 FFmpeg 包含文件来做到这一点。
请参阅 http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3
4.10 我在我的 C++ 应用程序中使用 libavutil,但编译器抱怨“UINT64_C”未在此作用域中声明
FFmpeg 是一个使用 C99 数学功能的纯 C 项目,为了使 C++ 能够使用它们,您必须将 -D__STDC_CONSTANT_MACROS 追加到您的 CXXFLAGS 中
4.11 我在内存中有一个文件/一个不同于 *open/*read/libc 的 API,我如何在 libavformat 中使用它?
您必须使用 avio_alloc_context
创建自定义 AVIOContext,请参阅 FFmpeg 中的 libavformat/aviobuf.c 和 MPlayer 或 MPlayer2 源代码中的 libmpdemux/demux_lavf.c。
4.12 哪里有关于 ffv1、msmpeg4、asv1、4xm 的文档?
请参阅 https://www.ffmpeg.org/~michael/
4.13 如何将 H.263-RTP(以及 RTP 中的其他编解码器)馈送到 libavcodec?
即使 RTP 具有网络导向的特殊性,它也像任何其他容器一样。您必须先解复用 RTP,然后才能将有效负载馈送到 libavcodec。在这种特定情况下,请查看 RFC 4629,了解应该如何操作。
4.14 AVStream.r_frame_rate 是错误的,它远大于帧率。
r_frame_rate
不是平均帧率,它是可以准确表示所有时间戳的最小帧率。所以,如果它大于平均值,那么它并没有错!例如,如果您混合了 25 和 30 fps 的内容,则 r_frame_rate
将为 150(它是最小公倍数)。如果您正在寻找平均帧率,请参阅 AVStream.avg_frame_rate
。
4.15 为什么 make fate
不运行所有测试?
请确保您拥有 fate-suite 示例,并且 SAMPLES
Make 变量、FATE_SAMPLES
环境变量或 --samples
configure
选项已设置为正确的路径。
4.16 为什么 make fate
找不到样本?
您是否碰巧在示例路径中使用 ~
字符来指示主目录?该值在 shell 无法扩展它的情况下使用,导致 FATE 找不到文件。只需将 ~
替换为完整路径即可。
本文档是于 2025 年 1 月 21 日使用 makeinfo 生成的。
托管服务由 telepoint.bg 提供