1

我找不到任何适用于 ffmpeg 的 Python 绑定,所以我决定使用 SWIG 生成一个。int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);生成既快速又简单(无需自定义,只是默认的 SWIG 界面),但使用libavformat/avformat.h等一些函数时会出现问题。使用 C 可以简单地通过以下方式运行:

AVFormatContext *pFormatCtx = NULL;
int status;
status = avformat_open_input(&pFormatCtx, '/path/to/my/file.ext', NULL, NULL);

在 Python 中,我尝试以下操作:

>>> from ppmpeg import *
>>> av_register_all()
>>> FormatCtx = AVFormatContext()
>>> FormatCtx
<ppmpeg.AVFormatContext; proxy of <Swig Object of type 'struct AVFormatContext *' at 0x173eed0> >
>>> avformat_open_input(FormatCtx, '/path/to/my/file.ext', None, None)
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
TypeError: in method 'avformat_open_input', argument 1 of type 'AVFormatContext **'

问题是 Python 没有 & 等价物。我尝试使用cpointer.i和它的pointer_class%pointer_class(AVFormatContext, new_ctx)),但new_ctx()返回指针,这不是我想要的。%pointer_class(AVFormatContext *, new_ctx)是非法的并给出语法错误。如果有任何帮助,我将不胜感激。谢谢。

编辑:我忘了提到我尝试使用类型映射,但不知道如何为结构编写自定义类型映射,并且文档只有基本类型的示例,如 int 或 float ...

4

1 回答 1

1

这看起来像是一个输出参数。这在 C 中是必要的,因为 C 只允许一个返回值,但 Python 允许多个。SWIG 让您可以将参数标记为 OUTPUT 或 INOUT 以完成您想要的操作。看到这个

您也可以使用类型图手动完成。类型图允许您指定任意转换。

例如,您可能需要intypemap文档argout中描述的类型映射。

请注意,由于您使用的是自定义数据类型,因此您需要确保声明结构的标头包含在生成的 .cpp 中。如果 SWIG 没有自动处理这个问题,那么在你的 .i 顶部放置类似这样的内容

// This block gets copied verbatim into the header area of the generated wrapper.

%{
#include "the_required_header.h"
%}
于 2013-05-02T17:03:52.360 回答