У меня есть файл .H, как открыть его общедоступные методы для библиотеки .Net? - PullRequest
4 голосов
/ 21 августа 2010

У меня есть такой .H файл (от здесь )

/*
  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 # (поэтому я превратил этот проект (ссылка приведена выше) в dll \ library и попытался скомпилируйте его с помощью clr и clr: old ... он компилируется и dll доступен из C #, но не из его функций / классов ... Я просто не знаю, что изменить в этом классе, чтобы превратить его в доступный из .net)

Ответы [ 2 ]

2 голосов
/ 22 августа 2010

Я считаю, что вы ищете C ++ / CLI (http://en.wikipedia.org/wiki/C++/CLI и http://msdn.microsoft.com/en-us/library/xey702bw.aspx).Хотя я сам не эксперт, я думаю, что вы могли бы избежать изменения объявления класса на

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

(обратите внимание, что вам также придется отредактировать соответствующий файл .cpp, чтобы использоватьnamespace).

Если это не сработает, вы сможете написать управляемый класс, который обернет исходный класс C ++.

0 голосов
/ 21 августа 2010

Вам необходимо изучить P / Invoke , который позволяет вызывать собственные методы DLL из управляемого кода.У него много ошибок и подводных камней, поэтому будьте осторожны и понимайте, что это будет нелегко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...