如何从静态构建中使用FFMpeg的CLI界面?

时间:2018-04-17 14:03:38

标签: ios objective-c ffmpeg

我已将此(https://github.com/kewlbear/FFmpeg-iOS-build-script)版本的ffmpeg添加到我的项目中。我无法在包含的标题中看到库的入口点。

如何访问独立应用程序所具有的基于文本命令的系统或同等系统?

如果有人能指出允许你在没有命令行界面的情况下使用FFmpeg的文档,我也会很高兴。

这就是我想要执行的东西(我使用CLI版本的ffmpeg在windows和android上工作)

ffmpeg -framerate 30 -i snap%03d.jpg -itsoffset 00:00:03.23333 -itsoffset 00:00:05 -i soundEffect.WAV -c:v libx264 -vf fps=30 -pix_fmt yuv420p result.mp4

3 个答案:

答案 0 :(得分:5)

实际上你可以构建ffmpeg库,包括ffmpeg二进制代码(ffmpeg.c)。唯一要关心的是将函数main(int argc, char **argv)重命名为ffmpeg_main(int argc, char **argv) - 然后您可以使用参数调用它,就像您执行ffmpeg二进制一样。请注意,argv[0]应包含程序名称,只需"ffmpeg"即可。

在Android VideoKit库中使用了相同的方法。

答案 1 :(得分:0)

要执行您想要的操作,您必须在代码中使用已编译的FFmpeg库。

您正在寻找的是FFmpeg文档libavformat/output-example.c提供的代码(通常表示AVFormatAVCodec FFmpeg的库。

Stackoverflow不是“请为我做的”平台。所以我更喜欢在这里解释你必须做的事情,我会尽量准确地回答你所有的问题。

我假设您已经知道如何将已编译的(静态或共享)库链接到Xcode项目,这不是此处的主题。

那么,我们来谈谈这段代码吧。它根据持续时间创建视频(包含随机生成的视频流和音频流)。您想基于图片列表和声音文件创建视频。完美,您只需要做三个主要修改:

  • 结束条件没有达到持续时间,但是到达文件列表的末尾(在代码中已经存在#define STREAM_NB_FRAMES,您可以使用它来迭代所有帧。)
  • 使用您自己的方法替换虚拟void fill_yuv_image,从文件中加载和解码图像缓冲区。
  • 使用您自己的方法替换虚拟void write_audio_frame,从您的文件加载和解码音频缓冲区。

(您可以在第271行找到“如何加载音频文件内容”示例on documentation,轻松适应有关文档的视频内容)

在此代码中,与CLI相比,您可以找出:

    主要的
  • const char *filename;应该是输出文件“result.mp4”
  • #define STREAM_FRAME_RATE 25(替换为 30 )。
  • 对于MP4生成,视频帧默认以H.264编码(在此代码中,GOP为12)。所以不需要精确的libx264。
  • #define STREAM_PIX_FMT PIX_FMT_YUV420P代表您所需的 yuv420p 解码格式。

现在,通过这些官方示例和相关文档,您可以实现您的目标。请注意,这些示例中的FFmpeg版本与当前FFmpeg版本之间存在一些差异。例如:

st = av_new_stream(oc, 1); // line 60

可以替换为:

st = avformat_new_stream(oc, NULL);
st->id = 1;

或者:

if (avcodec_open(c, codec) < 0) { // line 97

可以替换为:

if (avcodec_open2(c, codec, NULL) < 0) {

或者再次:

dump_format(oc, 0, filename, 1); // line 483

可以替换为:

av_dump_format(oc, 0, filename, 1);

CODEC_ID_NONE AV_CODEC_ID_NONE ...等等

问你的问题,但你得到了所有的钥匙! :)

答案 2 :(得分:0)

MobileFFMpeg是一个易于使用的吊舱。有关如何使用MobileFFMpeg的说明,网址为:https://stackoverflow.com/a/59325680/1466453

MobileFFMpeg提供了一种非常简单的方法,可将ffmpeg命令转换为IOS Objective-c程序。

几乎所有ffmpeg命令和开关都受支持。但是,您必须获得具有适当许可证的吊舱。例如min-gpl不会为您提供libiconv的功能。 libiconv已在vidoe,gpl和full-gpl许可证中融合。

如果您在使用MobileFFMpeg方面存在特定问题,请突出显示