主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#, IronPython: 動画をキャプチャしてサムネイルを作る

                
.NETでの動画のサムネイルの作り方はこれまでに二通りやってきた。

一つ目はWPFのMediaElementによる再生で、ディスプレイ上に表示した動画をキャプチャするやり方だ。ディスプレイに動画を表示しなければいけないが、表示サイズは1×1でも表示できればサムネイルは問題なくキャプチャできる。この方法はDRMのかかったコンテンツでもキャプチャできるというメリットがある。しかしグラフィック機能の弱いコンピュータ(グラボなしのi3 M370とか)で使うと、MediaElementの副作用で一瞬ディスプレイの描画が止まる。
http://elicon.blog57.fc2.com/blog-entry-177.html

二つ目のやり方はDirectShowを使ったやり方で、動画をディスプレイ上に表示しなくてもキャプチャできる。だけどDRMのかかったコンテンツは開けない。そしてDirectShowがもとは.NET向けの技術でないために、ドキュメントや使い方の面で不便。
http://elicon.blog57.fc2.com/blog-entry-186.html

今回は三つ目のやり方を見つけたので、ちょいとC#でやってみる。クラス化したので、dllにしてIronPythonから使うことだってもちろんできる。
必要なのはMicrosoft Expression Encoder 4。これのインストール時にSDKとサンプルがついてくる。
やっぱりDRMコンテンツは扱えないのだけど、SDKは標準でC#から使えるようになっている。これならDirectShowの代替手段として使える。ドキュメントは下記。
http://msdn.microsoft.com/en-us/library/cc761464(v=expression.40).aspx

C#コードは下記。これをdllにすれば容易にサムネイルが作れる。
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Microsoft.Expression.Encoder;

namespace Generator
{
public static class ThumbnailGenerator
{

public static void SaveThumbnail(string src, string outputName, double point)
{
Bitmap thumbnail = GetThumbnail(src, point);

// sets thumbnail name unique and saves
thumbnail.Save(outputName, ImageFormat.Jpeg);

thumbnail.Dispose();
}

public static Bitmap GetThumbnail(string src, double point)
{
Bitmap thumbnail;
//string bitmapDir = Environment.CurrentDirectory;

if (!File.Exists(src))
{
System.ArgumentException argEx = new System.ArgumentException("Source file not found");
throw argEx;
}
AudioVideoFile avFile = null;
try
{
avFile = new AudioVideoFile(src);
}
catch (Exception ex)
{
System.ArgumentException argEx = new System.ArgumentException(ex.Message);
throw argEx;
}

// Gets the time for each thumbnail.
if (point > avFile.Duration.TotalSeconds)
{
Console.WriteLine(avFile.Duration.TotalSeconds);
System.ArgumentException argEx = new System.ArgumentException("Over a duration");
throw argEx;
}

// Create ThumbnailGenerator object to get thumbs from AudioVideoFile
Microsoft.Expression.Encoder.ThumbnailGenerator generator = avFile.CreateThumbnailGenerator(avFile.VideoStreams[0].VideoSize);

// Gets image based on timing
thumbnail = generator.CreateThumbnail(TimeSpan.FromSeconds(point));

generator.Dispose();
return thumbnail;
}
}
}


dllを用意したら、.NET Framework環境なら他の言語からも使える。IronPythonからは以下のように。
import clr

clr.AddReference('Generator')
clr.AddReference('System.Drawing')

from Generator import ThumbnailGenerator
from System.Drawing import Bitmap

ThumbnailGenerator.SaveThumbnail(r"C:\Users\h\Videos\***.mp4",
r'c:\users\h\desktop\hoge.jpg',
10.0)

bitmap = ThumbnailGenerator.GetThumbnail(r"C:\Users\h\Videos\***.mp4",
15.0)
bitmap.Save("hoge.png")


C#
using Generator
using System.Drawing

ThumbnailGenerator.SaveThumbnail(@"C:\Users\h\Videos\***.mp4",
@'c:\users\h\desktop\hoge.jpg',
10.0);

Bitmap bitmap = ThumbnailGenerator.GetThumbnail(@"C:\Users\h\Videos\***.mp4",
15.0);
bitmap.Save("hoge.png");
            

コメントの投稿

非公開コメント

プロフィール

Matoba

Author:Matoba

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。