每个编解码器的类型或编解码器的类型 在列表中我最终有大约500个编解码器,我希望例如在列表的开头它将显示例如:
电台 mpeha mpegv ..... 视频 XVID 的DivX
等等。
获取编解码器列表的前两个函数位于C:
const char* Encoder_GetNextCodecName()
{
current_codec = av_codec_next(current_codec);
while (current_codec != NULL)
{
return current_codec->name;
}
return "";
}
const char* Encoder_GetFirstCodecName()
{
current_codec = NULL;
return Encoder_GetNextCodecName();
}
然后我有头文件:
const char* Encoder_GetNextCodecName();
const char* Encoder_GetFirstCodecName();
然后我创建List的另一个C ++头文件:
List<String^> ^GetCodecs()
{
List<String^> ^l = gcnew List<String^>;
String ^s = gcnew String(Encoder_GetFirstCodecName());
while (!String::IsNullOrEmpty(s))
{
l->Add(s);
s = gcnew String(Encoder_GetNextCodecName());
}
return l;
}
然后当我在CSHARP做这个时:
List<string> l = new List<string>(f.GetCodecs());
我看到变量l包含506个编解码器。 编解码器是ffmpeg !!!
现在在C文件中还有类似的内容:
current_codec->type
其中有许多属性。 在C文件中也有这样的东西:
AVMediaType::
这给了我7种类型的编解码器。
问题是我在创建List时如何在C ++头文件中创建List,每个编解码器的类型或每组编解码器的类型如:音频,视频,数据......?< / p>
修改
这是我在C函数和CLI之间连接的另一个头文件:
我有另一个头文件,我首先从C:
调用函数ifdef __cplusplus
extern "C"
{
#endif
#include <stdint.h>
bool Encoder_MoveToNextCodec();
bool Encoder_MoveToFirstCodec();
const char* Encoder_GetCurrentCodecName();
int Encoder_GetCurrentCodecType();
#ifdef __cplusplus
} // extern "C"
#endif
这是我的CLI代码:
#pragma once
// FFMPEG_WRAPPER.cpp : Defines the exported functions for the DLL application.
//
#include "ENCODER.h"
#include <stdlib.h>
#include <string.h>
#include <msclr\marshal.h>
#include <vcclr.h>
#include <cstdlib>
#include <Windows.h>
using namespace System;
using namespace System::Drawing;
using namespace System::Collections::Generic;
using namespace System::Runtime::InteropServices;
using namespace System::Drawing::Imaging;
using namespace msclr::interop;
namespace MyVideo
{
public ref class FFMPEGWrapper
{
public:
FFMPEGWrapper(void)
{
Encoder_init();
}
ref class CodecInfo
{
public:
String^ CodecName;
int CodecType;
};
List<CodecInfo^> ^GetCodecs()
{
List<CodecInfo^> ^l = gcnew List<CodecInfo^>;
bool KeepLooping = Encoder_MoveToFirstCodec();
while (KeepLooping)
{
CodecInfo ^codec = gcnew CodecInfo();
codec->CodecName = gcnew String(Encoder_GetCurrentCodecName());
codec->CodecType = Encoder_GetCurrentCodecType();
l->Add(codec);
KeepLooping = Encoder_MoveToNextCodec();
}
return l;
}
然后在CSHARP中我做了:
List<f.CodecInfo> l = f.GetCodecs();
但CodecInfo不存在,我在GetCodecs()
上收到错误错误1无法将类型'System.Collections.Generic.List'隐式转换为'System.Collections.Generic.List'
错误2'ScreenVideoRecorder.Form1.f'是'字段',但用作“类型”
CSHARP中的错误问题。
答案 0 :(得分:1)
您需要扩展C代码以显示所需的额外详细信息,例如:
__declspec(thread) AVCodec* current_codec = NULL;
bool Encoder_MoveToNextCodec()
{
current_codec = av_codec_next(current_codec);
return (current_codec != NULL);
}
bool Encoder_MoveToFirstCodec()
{
current_codec = NULL;
return Encoder_MoveToNextCodec();
}
const char* Encoder_GetCurrentCodecName()
{
if (current_codec != NULL)
return current_codec->name;
return "";
}
int Encoder_GetCurrentCodecType()
{
if (current_codec != NULL)
return (int) current_codec->type;
return AVMEDIA_TYPE_UNKNOWN;
}
然后展开您的CLI代码以存储该信息:
ref class CodecInfo
{
public:
String^ CodecName;
int CodecType;
...
};
List<CodecInfo^> ^GetCodecs()
{
List<CodecInfo^> ^l = gcnew List<CodecInfo^>;
bool KeepLooping = Encoder_MoveToFirstCodec();
while (KeepLooping)
{
CodecInfo ^codec = gcnew CodecInfo();
codec->CodecName = gcnew String(Encoder_GetCurrentCodecName());
codec->CodecType = Encoder_GetCurrentCodecType();
...
l->Add(codec);
KeepLooping = Encoder_MoveToNextCodec();
}
return l;
}
然后,根据需要使用新信息:
List<CodecInfo> l = f.GetCodecs();
foreach(CodecInfo codec in l)
{
// use codec.CodecName, codec.CodecType, ... as needed
}