我找不到任何有效的ffmpeg Python绑定,所以我决定使用SWIG生成一个。生成既快速又简单(没有自定义,只是默认的SWIG界面),但这些问题使用了来自libavformat/avformat.h的int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);
等函数。使用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没有&amp;当量。我尝试使用cpointer.i
及其pointer_class
(%pointer_class(AVFormatContext, new_ctx)
),但new_ctx()
返回指针,这不是我想要的。 %pointer_class(AVFormatContext *, new_ctx)
是非法的,并且会出现语法错误。我将不胜感激任何帮助。感谢。
编辑: 我忘了提到我试图使用类型映射,但不知道如何编写自定义类型映射的结构和文档只有基本类型的例子,如int或float ...
答案 0 :(得分:1)
看起来这是一个out参数。这在C中是必要的,因为C只允许一个返回值,但Python允许多个。 SWIG允许您将参数标记为OUTPUT或INOUT,以完成您想要的任务。请参阅this。
您也可以使用typemap手动执行此操作。使用typemap可以指定任意转换。
例如,您可能需要in
中描述的argout
和// This block gets copied verbatim into the header area of the generated wrapper.
%{
#include "the_required_header.h"
%}
字体图。
请注意,由于您使用的是自定义数据类型,因此需要确保声明结构的头文件包含在生成的.cpp中。如果SWIG没有自动处理这个问题,那就把这样的东西放在.i
的顶部{{1}}