Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

API for webm video conversion

Tags:

c#

api

webm

Does anyone know about any (prototype) c# API's for converting video to google's new WebM video format?

like image 995
Klaus Byskov Pedersen Avatar asked May 20 '10 13:05

Klaus Byskov Pedersen


People also ask

Can HandBrake convert to WebM?

HandBrake leverages tools such as FFmpeg, x264, and x265 to create new MP4, MKV, or WebM video files from these Sources . HandBrake does: Convert nearly any video to MP4, MKV, or WebM.


1 Answers

A quick google search says: no. But the example encoder looks like it should be easily translatable to C# using P/Invoke. The Encoder Algorithm Interface looks quite manageable. And there's always C++/CLI if everything else fails. Who starts the codeplex project? :-)

Update: As of now, there is a hackish, rudimentary working prototype .NET API. Here you go:

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

You should be able to link this against vpxmtd.lib from the libvpx Windows build. I wasn't able to get rid of one warning, but so far it seems to work. My C++/CLI is a bit rusty, though, so there may be some memory leaks in the code.

Test program:

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());
            }
        }
    }
}
like image 67
dtb Avatar answered Sep 20 '22 12:09

dtb