什么是ffmpeg、avcodec和x264?

11

根据维基百科上的资料,FFmpeg是一个自由软件项目,用于处理多媒体数据的库和程序。FFmpeg最著名的部分是libavcodec,这是一个音频/视频编解码器库,被其他几个项目使用;libavformat则是一个音频/视频容器混合和解混合库;而ffmpeg命令行程序则用于转码多媒体文件。

所以,ffmpeg是avcodec的包装器吗?我经常听到人们使用ffmpeg使用x264进行视频编码。那么ffmpeg也是x264的包装器吗?

它们之间有什么关系呢?

1个回答

31
首先,澄清一些术语:
- FFmpeg是一个软件项目,有许多人参与,一个Wiki,一个bug跟踪器,一些资金等。 - `ffmpeg`是他们提供的工具之一(其他的还有`ffplay`和`qt-faststart`等)。 - Libav是FFmpeg项目的一个分支,提供了`avconv`二进制文件。一些发行版决定在一段时间内使用Libav而不是FFmpeg程序,特别是Ubuntu,在过渡期间Libav命令仍然被命名为`ffmpeg`,这引起了一些混乱。当前的Ubuntu再次使用“真正的”`ffmpeg`。
像你所说的,`ffmpeg`工具是一个命令行包装器,用于处理多媒体内容的许多库,其中包括: 尽管FFmpeg开发人员经常提供自己的编码器和解码器,但您可以启用具有libavcodec包装器的第三方库,以将FFmpeg与最流行的H.264编码器之一x264等“粘合”在一起。 如果决定编写一个新的H.264编码器以达到比x264更好的目标,则通常会这样做,因为“重复造轮子”毫无意义。 在其他情况下,由于许可问题(例如libfaac),某些库可能不会随ffmpeg构建一起提供,此时ffmpeg提供本地AAC编码器。

常见的外部编码器包括:

  • libx264
  • libvpx(用于VP8和VP9视频)
  • libfaac、libfdk-aac、libvo-aacenc用于AAC音频
  • libmp3lame
  • libvorbis
  • libxvid
对于这些内容,您可以在libavcodec下找到包装器,例如对于libx264,文件libx264.c提供了将视频从FFmpeg内部格式推送到x264编码器所需的代码,然后将其传递给libavformat以写入文件。实际编码是通过libx264完成的。
如前所述,其他编码器(如MPEG-4的编码器)是FFmpeg本身的本地编码器,完全不依赖于外部库。
最后,有几个程序使用FFmpeg工具和库,无论是提供ffmpeg可执行文件,还是选择libavcodec和libavformat库的部分。根据许可证,这是允许的,并使FFmpeg成为当今最流行的多媒体工具集合。

1
H263编解码器是否是FFmpeg的一部分? - onmyway133
1
FFmpeg的H.263编解码器是原生的,没错。 - slhck
我还是不明白。我正在使用Accord.NET将mp4编码为H.264和AAC,而Accord.NET使用ffmpeg。但听起来你是在说ffmpeg本身不能进行H.264编码。这是否意味着Accord.NET必须使用libx264? - Kyle Delaney
1
@KyleDelaney 简而言之,是的。虽然我不熟悉Accord.NET,但基本上没有什么替代方案可以使用免费、开源工具对H.264进行编码。 - slhck
谢谢。这太糟糕了,因为根据FFmpeg网站的说明,如果涉及像libx264这样的GPL库,则无法在LGPL下使用它。 - Kyle Delaney
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接