我如何在列表编解码器中实现它,它还将显示每个编解码器的类型?

时间:2013-05-05 08:50:04

标签: c++-cli

每个编解码器的类型或编解码器的类型 在列表中我最终有大约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中的错误问题。

1 个答案:

答案 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
}