Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SomeType**作为函数参数的Python SWIG绑定_Python_C_Ffmpeg_Swig - Fatal编程技术网

使用SomeType**作为函数参数的Python SWIG绑定

使用SomeType**作为函数参数的Python SWIG绑定,python,c,ffmpeg,swig,Python,C,Ffmpeg,Swig,我找不到任何适用于ffmpeg的Python绑定,所以我决定使用SWIG生成一个。生成过程快速且简单(无需定制,只是默认的SWIG界面),但使用一些函数(如int avformat\u open\u input)(AVFormatContext**ps,const char*filename,AVInputFormat*fmt,AVDictionary**options)会出现问题从。使用C,只需通过以下方式运行: 在Python中,我尝试以下内容: 来自ppmpeg导入的>>* >>>av

我找不到任何适用于ffmpeg的Python绑定,所以我决定使用SWIG生成一个。生成过程快速且简单(无需定制,只是默认的SWIG界面),但使用一些函数(如
int avformat\u open\u input)(AVFormatContext**ps,const char*filename,AVInputFormat*fmt,AVDictionary**options)会出现问题从。使用C,只需通过以下方式运行:

在Python中,我尝试以下内容:

来自ppmpeg导入的
>>*
>>>av_寄存器_all()
>>>FormatCtx=AVFormatContext()
>>>FormatCtx
>>>avformat_open_输入(FormatCtx,'/path/to/my/file.ext',无,无)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:在方法“avformat\u open\u input”中,参数1的类型为“AVFormatContext**”
问题是Python并没有&等价物。我尝试使用
cpointer.I
及其
指针类
%pointer\u类(AVFormatContext,new\u ctx)
),但
new\u ctx()
返回指针,这不是我想要的<代码>%pointer\u类(AVFormatContext*,new\u ctx)
非法,并给出语法错误。如果有任何帮助,我将不胜感激。谢谢

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

这看起来像是一个out参数。这在C中是必要的,因为C只允许一个返回值,而Python允许多个。SWIG允许您将参数标记为输出或INOUT,以实现所需的功能。看

您还可以使用typemap手动执行此操作。类型映射允许您指定任意转换

例如,您可能需要在
argout中使用类型映射,如中所述

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

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

%{
#include "the_required_header.h"
%}

这看起来像是一个out参数。这在C中是必要的,因为C只允许一个返回值,而Python允许多个。SWIG允许您将参数标记为输出或INOUT,以实现所需的功能。看

您还可以使用typemap手动执行此操作。类型映射允许您指定任意转换

例如,您可能需要在和argout中使用类型映射,如中所述

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

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

%{
#include "the_required_header.h"
%}

啊,对不起,我忘了提一下,我试图使用带有
%apply-AVFormatContext*输出{AVFormatContext**ps}的typemap但这没有效果,因为SWIG不知道如何处理它
avformat.i:6:警告453:无法应用(AVFormatContext*输出)。没有定义类型映射。我阅读文档,我认为它非常全面,但是它不包含如何为Syrt编写Type MeMeP的示例,只包含基本C和Python类型。能否提供struct的类型映射定义示例?将更新我的问题。@vericle
%apply
不是类型映射。它就像一个
#define
。你需要一个
%typemap
。谢谢,我在
%include typemap之后使用了
%apply
。我希望SWIG对结构有通用的typemap定义。我错了。所以基本上,我需要写我自己的类型图。由于ffmpeg结构非常复杂,这需要大量的工作,这样的结构可能包含嵌套结构,并且类型映射是特定于语言的。我对它不满意,但如果这是唯一的方法,我想我别无选择。啊,对不起,我忘了提及,我尝试使用带有
%apply-AVFormatContext*OUTPUT{AVFormatContext**ps}的typemap但这没有效果,因为SWIG不知道如何处理它
avformat.i:6:警告453:无法应用(AVFormatContext*输出)。没有定义类型映射。我阅读文档,我认为它非常全面,但是它不包含如何为Syrt编写Type MeMeP的示例,只包含基本C和Python类型。能否提供struct的类型映射定义示例?将更新我的问题。@vericle
%apply
不是类型映射。它就像一个
#define
。你需要一个
%typemap
。谢谢,我在
%include typemap之后使用了
%apply
。我希望SWIG对结构有通用的typemap定义。我错了。所以基本上,我需要写我自己的类型图。由于ffmpeg结构非常复杂,这需要大量的工作,这样的结构可能包含嵌套结构,并且类型映射是特定于语言的。我对它不满意,但如果这是唯一的方法,我想我别无选择。你是如何得到avformat的swig接口文件的?还是你自己写的?你是如何得到AVF格式的swig接口文件的?还是你自己写的?
// This block gets copied verbatim into the header area of the generated wrapper.

%{
#include "the_required_header.h"
%}