代码之家  ›  专栏  ›  技术社区  ›  Klaus Byskov Pedersen

用于WebM视频转换的API

  •  9
  • Klaus Byskov Pedersen  · 技术社区  · 14 年前

    是否有人知道将视频转换为谷歌新的WebM视频格式的任何(原型)C API?

    1 回复  |  直到 12 年前
        1
  •  8
  •   dtb    14 年前

    谷歌的快速搜索显示:没有,但是 example encoder 看起来它应该可以很容易地通过p/invoke转换为c。这个 Encoder Algorithm Interface 看起来很容易管理。如果其他的东西都失败了,总是有c++/CLI。谁启动codeplex项目?-)

    更新: 到目前为止,有一个简单的.NET API原型。干得好:

    #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));
                        }
                    }
                };
            }
        }
    }
    

    你应该能把这个和 VPXMTDLIB libvpx Windows build . 我无法摆脱一个警告,但到目前为止,它似乎起作用了。但是,我的c++/CLI有点生锈,所以代码中可能存在内存泄漏。

    测试程序:

    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());
                }
            }
        }
    }