2010-08-21 47 views
4

我有這樣的.H文件(從here我有.H文件,如何打開它的公共方法到.Net庫?

/* 
    FFmpeg simple Encoder 
*/ 


#ifndef __VIDEO_ENCODER_H__ 
#define __VIDEO_ENCODER_H__ 

#include "ffmpegInclude.h" 
#include <Windows.h> 
#include <string> 

class VideoEncoder 
{ 
    private: 

    // output file name 
    std::string  outputFilename; 
    // output format. 
    AVOutputFormat *pOutFormat; 
    // format context 
    AVFormatContext *pFormatContext; 
    // video stream context 
    AVStream * pVideoStream; 
    // audio streams context 
    AVStream * pAudioStream; 
    // convert context context 
    struct SwsContext *pImgConvertCtx; 
    // encode buffer and size 
    uint8_t * pVideoEncodeBuffer; 
    int nSizeVideoEncodeBuffer; 

    // audio buffer and size 
    uint8_t * pAudioEncodeBuffer; 
    int nSizeAudioEncodeBuffer; 


    // count of sample 
    int audioInputSampleSize; 
    // current picture 
    AVFrame *pCurrentPicture; 

    // audio buffer 
    char* audioBuffer; 
    int nAudioBufferSize; 
    int nAudioBufferSizeCurrent; 

    public: 

    VideoEncoder() 
    { 
    pOutFormat = NULL; 
    pFormatContext = NULL; 
    pVideoStream = NULL; 
    pImgConvertCtx = NULL; 
    pCurrentPicture = NULL; 
    pVideoEncodeBuffer = NULL; 
    nSizeVideoEncodeBuffer = 0; 
    pAudioEncodeBuffer = NULL; 
    nSizeAudioEncodeBuffer = 0; 
    nAudioBufferSize = 1024 * 1024 * 4; 
    audioBuffer  = new char[nAudioBufferSize]; 
    nAudioBufferSizeCurrent = 0; 
    } 

    virtual ~VideoEncoder() 
    { 
    Finish(); 
    } 

    // init output file 
    bool InitFile(std::string& inputFile, std::string& container); 
    // Add video and audio data 
    bool AddFrame(AVFrame* frame, const char* soundBuffer, int soundBufferSize); 
    // end of output 
    bool Finish(); 

    private: 

    // Add video stream 
    AVStream *AddVideoStream(AVFormatContext *pContext, CodecID codec_id); 
    // Open Video Stream 
    bool OpenVideo(AVFormatContext *oc, AVStream *pStream); 
    // Allocate memory 
    AVFrame * CreateFFmpegPicture(int pix_fmt, int nWidth, int nHeight); 
    // Close video stream 
    void CloseVideo(AVFormatContext *pContext, AVStream *pStream); 
    // Add audio stream 
    AVStream * AddAudioStream(AVFormatContext *pContext, CodecID codec_id); 
    // Open audio stream 
    bool OpenAudio(AVFormatContext *pContext, AVStream *pStream); 
    // close audio stream 
    void CloseAudio(AVFormatContext *pContext, AVStream *pStream); 
    // Add video frame 
    bool AddVideoFrame(AVFrame * frame, AVCodecContext *pVideoCodec); 
    // Add audio samples 
    bool AddAudioSample(AVFormatContext *pFormatContext, 
    AVStream *pStream, const char* soundBuffer, int soundBufferSize); 
    // Free resourses. 
    void Free(); 
    bool NeedConvert(); 
}; 

#endif // __VIDEO_ENCODER_H__ 

我想封裝這個「視頻編碼器」到一些空間和編譯它,這樣我就可以從C#acsess視頻編碼器功能(使我將該項目(上面提供的鏈接)轉換爲dll \ library,並嘗試使用clr和clr編譯它:old ...它編譯並且dll可以從C#訪問,但不是它的函數/類...我只是不知道是什麼在這個類中進行修改以將其變爲可接受的來自.net)

回答

2

我相信你要找的是C++/CLI(http://en.wikipedia.org/wiki/C++/CLIhttp://msdn.microsoft.com/en-us/library/xey702bw.aspx)。雖然我不是專家,我自己,我想你也許能更改類聲明

namespace MyNamespace 
{ 
    public ref class VideoEncoder 
    { 
     // Existing contents of VideoEncoder class 
    } 
} 

(請注意,您還必須編輯匹配.cpp文件使用的名稱空間)脫身。

如果這不起作用,您應該能夠編寫一個託管的類來包裝原始的C++類。

+0

一般來說,我喜歡你的想法,但它給了我100個錯誤,所以我繼續了另一種doind的方式,意... – Rella 2010-08-21 22:43:57

0

您需要查看P/Invoke,它允許從託管代碼調用本機DLL方法。它有許多陷阱和陷阱,所以要小心,並瞭解它並不容易。

+0

我的主要想法是不使用C#來創建真正的.net dll,而是在Visual C++中創建真正的.net dll – Rella 2010-08-21 00:32:09

相關問題