2010-05-20 19 views

Trả lời

8

Tìm kiếm nhanh trên google cho biết: không. Tuy nhiên, example encoder có vẻ như nó sẽ dễ dàng dịch sang C# bằng cách sử dụng P/Invoke. Encoder Algorithm Interface trông khá dễ quản lý. Và luôn có C++/CLI nếu mọi thứ khác không thành công. Ai bắt đầu dự án codeplex? :-)

Cập nhật: Hiện tại, có một nguyên mẫu hoạt động thô lỗ, thô sơ .NET API. Ở đây bạn đi:

#include "vpx_codec.h" 

#define VPX_CODEC_DISABLE_COMPAT 1 
#include "vpx_encoder.h" 
#include "vp8cx.h" 

#define vp8iface (&vpx_codec_vp8_cx_algo) 

using namespace System; 

namespace WebM 
{ 
    namespace VP8 
    { 
     namespace Native 
     { 
      public ref class VP8Codec 
      { 
      private: 
       vpx_codec_ctx_t* ctx; 

       VP8Codec(vpx_codec_ctx_t* ctx) 
       { 
        this->ctx = ctx; 
       } 

      public: 
       ~VP8Codec() 
       { 
        vpx_codec_destroy(ctx); 
        delete ctx; 
       } 

       property String^ LastError 
       { 
        String^ get() 
        { 
         return gcnew String(vpx_codec_error(ctx)); 
        } 
       } 

       property String^ LastErrorDetail 
       { 
        String^ get() 
        { 
         return gcnew String(vpx_codec_error_detail(ctx)); 
        } 
       } 

       int Encode() 
       { 
        // TODO: do actual encoding 
        return 
         vpx_codec_encode(ctx, NULL, 0, 1, 0, VPX_DL_REALTIME); 
       } 

       static VP8Codec^ CreateEncoder() // TODO: add 'config' argument 
       { 
        vpx_codec_ctx_t* ctx; 
        vpx_codec_enc_cfg_t cfg; 

        if(vpx_codec_enc_config_default(vp8iface, &cfg, 0)) 
        { 
         return nullptr; // TODO: throw exception 
        } 

        ctx = new vpx_codec_ctx_t; 

        if (vpx_codec_enc_init(ctx, vp8iface, &cfg, 0)) 
        { 
         delete ctx; 
         return nullptr; // TODO: throw exception 
        } 

        return gcnew VP8Codec(ctx); 
       } 

       static property int Version 
       { 
        int get() 
        { 
         return vpx_codec_version(); 
        } 
       } 

       static property String^ VersionString 
       { 
        String^ get() 
        { 
         return gcnew String(vpx_codec_version_str()); 
        } 
       } 

       static property String^ BuildConfig 
       { 
        String^ get() 
        { 
         return gcnew String(vpx_codec_build_config()); 
        } 
       } 

       static String^ GetErrorDescription(int errorCode) 
       { 
        return gcnew String(
         vpx_codec_err_to_string((vpx_codec_err_t)errorCode)); 
       } 

       static property String^ IfaceName 
       { 
        String^ get() 
        { 
         return gcnew String(vpx_codec_iface_name(vp8iface)); 
        } 
       } 
      }; 
     } 
    } 
} 

Bạn sẽ có thể liên kết này để chống lại vpxmtd.lib từ libvpx Windows build. Tôi đã không thể loại bỏ một cảnh báo, nhưng cho đến nay nó có vẻ hoạt động. Tuy nhiên, C++/CLI của tôi hơi bị gỉ nên có thể có một số rò rỉ bộ nhớ trong mã.

chương trình thử nghiệm:

namespace WebM.VP8 
{ 
    using System; 

    using WebM.VP8.Native; 

    public class Program 
    { 
     public static void Main() 
     { 
      using (var encoder = VP8Codec.CreateEncoder()) 
      { 
       Console.WriteLine(encoder.Encode()); 
      } 
     } 
    } 
} 
+1

Rất hữu ích. Cảm ơn rất nhiều. –

+0

hi! bạn đã thêm tham chiếu .lib vào dự án như thế nào? khi tôi cố gắng thêm một tham chiếu trong vs2010 nó không có gói .lib: s –

+0

bất cứ ai về nhà? :) –