web-dev-qa-db-ja.com

C#を使用してASP.Net MVCのビデオファイルからビデオメタデータを取得するための最良の方法は何ですか?

私はGoogleとStackOverflowで数時間検索してきました。 StackOverflowにも同様の質問がたくさんあるようですが、それらはすべて約3〜5歳です。

.NET Webアプリケーションのビデオファイルからメタデータをプルするために、FFMPEGを使用することは、今でも最良の方法ですか?もしそうなら、そこにある最高のC#ラッパーは何ですか?

MediaToolkit、MediaFile.dllを試してみましたが運がありませんでした。私はffmpeg-csharpeを見ましたが、それは数年の間触れられていないようです。

この件に関する現在のデータは見つかりませんでした。最新バージョンの.NETに組み込まれているビデオからメタデータをプルする機能はありますか?

私は基本的にこの時点で任意の方向を探しています。

私が使用するものはすべて、1時間に数千回呼び出される可能性があるため、効率的である必要があることを付け加えておきます。

11
Maddhacker24

MediaInfoプロジェクトをご覧ください( http://mediaarea.net/en/MediaInfo

ほとんどのメディアタイプに関する広範な情報を取得し、ライブラリには使いやすいc#ヘルパークラスがバンドルされています。

ここからWindows用のライブラリとヘルパークラスをダウンロードできます。

http://mediaarea.net/en/MediaInfo/Download/Windows(インストーラーなしのDLL)

ヘルパークラスは_Developers\Source\MediaInfoDLL\MediaInfoDLL.cs_にあり、プロジェクトに追加して、_MediaInfo.dll_をビンにコピーするだけです。

使用法

ライブラリから特定のパラメータをリクエストすることで情報を取得できます。サンプルは次のとおりです。

_[STAThread]
static void Main(string[] Args)
{
    var mi = new MediaInfo();
    mi.Open(@"video path here");

    var videoInfo = new VideoInfo(mi);
    var audioInfo = new AudioInfo(mi);
     mi.Close();
}

public class VideoInfo 
{
    public string Codec { get; private set; }
    public int Width { get; private set; }
    public int Heigth { get; private set; }
    public double FrameRate { get; private set; }
    public string FrameRateMode { get; private set; }
    public string ScanType { get; private set; }
    public TimeSpan Duration { get; private set; }
    public int Bitrate { get; private set; }
    public string AspectRatioMode { get; private set; }
    public double AspectRatio { get; private set; }

    public VideoInfo(MediaInfo mi)
    {
        Codec=mi.Get(StreamKind.Video, 0, "Format");
        Width = int.Parse(mi.Get(StreamKind.Video, 0, "Width"));
        Heigth = int.Parse(mi.Get(StreamKind.Video, 0, "Height"));
        Duration = TimeSpan.FromMilliseconds(int.Parse(mi.Get(StreamKind.Video, 0, "Duration")));
        Bitrate = int.Parse(mi.Get(StreamKind.Video, 0, "BitRate"));
        AspectRatioMode = mi.Get(StreamKind.Video, 0, "AspectRatio/String"); //as formatted string
        AspectRatio =double.Parse(mi.Get(StreamKind.Video, 0, "AspectRatio"));
        FrameRate = double.Parse(mi.Get(StreamKind.Video, 0, "FrameRate"));
        FrameRateMode = mi.Get(StreamKind.Video, 0, "FrameRate_Mode");
        ScanType = mi.Get(StreamKind.Video, 0, "ScanType");
    }
}

public class AudioInfo
{
    public string Codec { get; private set; }
    public string CompressionMode { get; private set; }
    public string ChannelPositions { get; private set; }
    public TimeSpan Duration { get; private set; }
    public int Bitrate { get; private set; }
    public string BitrateMode { get; private set; }
    public int SamplingRate { get; private set; }

    public AudioInfo(MediaInfo mi)
    {
        Codec = mi.Get(StreamKind.Audio, 0, "Format");
        Duration = TimeSpan.FromMilliseconds(int.Parse(mi.Get(StreamKind.Audio, 0, "Duration")));
        Bitrate = int.Parse(mi.Get(StreamKind.Audio, 0, "BitRate"));
        BitrateMode = mi.Get(StreamKind.Audio, 0, "BitRate_Mode");
        CompressionMode = mi.Get(StreamKind.Audio, 0, "Compression_Mode");
        ChannelPositions = mi.Get(StreamKind.Audio, 0, "ChannelPositions");
        SamplingRate = int.Parse(mi.Get(StreamKind.Audio, 0, "SamplingRate"));
    }
}
_

Inform()を呼び出すと、すべての情報を文字列形式で簡単に取得できます。

_        var mi = new MediaInfo();
        mi.Open(@"video path here");
        Console.WriteLine(mi.Inform());
        mi.Close();
_

使用可能なパラメーターに関する詳細情報が必要な場合は、Options("Info_Parameters")を呼び出すことですべてのパラメーターをクエリできます。

_        var mi = new MediaInfo();
        Console.WriteLine(mi.Option("Info_Parameters"));
        mi.Close();
_
19
user3473830

少し遅れるかもしれません... MediaToolKitのNuGetパッケージを使用して、最小限のコードでこれを行うことができます

詳細については、ここから始めてください MediaToolKit

11
kheya

Process.Startでffmpegを使用することをお勧めします。コードは次のようになります。

    private string GetVideoDuration(string ffmpegfile, string sourceFile) {
        using (System.Diagnostics.Process ffmpeg = new System.Diagnostics.Process()) {
            String duration;  // soon will hold our video's duration in the form "HH:MM:SS.UU"
            String result;  // temp variable holding a string representation of our video's duration
            StreamReader errorreader;  // StringWriter to hold output from ffmpeg

            // we want to execute the process without opening a Shell
            ffmpeg.StartInfo.UseShellExecute = false;
            //ffmpeg.StartInfo.ErrorDialog = false;
            ffmpeg.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            // redirect StandardError so we can parse it
            // for some reason the output comes through over StandardError
            ffmpeg.StartInfo.RedirectStandardError = true;

            // set the file name of our process, including the full path
            // (as well as quotes, as if you were calling it from the command-line)
            ffmpeg.StartInfo.FileName = ffmpegfile;

            // set the command-line arguments of our process, including full paths of any files
            // (as well as quotes, as if you were passing these arguments on the command-line)
            ffmpeg.StartInfo.Arguments = "-i " + sourceFile;

            // start the process
            ffmpeg.Start();

            // now that the process is started, we can redirect output to the StreamReader we defined
            errorreader = ffmpeg.StandardError;

            // wait until ffmpeg comes back
            ffmpeg.WaitForExit();

            // read the output from ffmpeg, which for some reason is found in Process.StandardError
            result = errorreader.ReadToEnd();

            // a little convoluded, this string manipulation...
            // working from the inside out, it:
            // takes a substring of result, starting from the end of the "Duration: " label contained within,
            // (execute "ffmpeg.exe -i somevideofile" on the command-line to verify for yourself that it is there)
            // and going the full length of the timestamp

            duration = result.Substring(result.IndexOf("Duration: ") + ("Duration: ").Length, ("00:00:00").Length);
            return duration;
        }
    }

お役に立てますように。

4
nonocast

ffmpegは、メタデータを読み取るための特別なアプリケーション ffprobe も提供しています。 .netのラッパーを作成し、 nugetパッケージ を提供しました。ここで見つけることができます: Alturos.VideoInfo

PM> Install-Package Alturos.VideoInfo

例:

var videoFilePath = "myVideo.mp4";

var videoAnalyer = new VideoAnalyzer();
var analyzeResult = videoAnalyer.GetVideoInfo(videoFilePath);
var videoInfo = analyzeResult.VideoInfo;
//videoInfo.Format.Filename = "myVideo.mp4"
//videoInfo.Format.NbStreams = 1
//videoInfo.Format.NbPrograms = 0
//videoInfo.Format.FormatName = "mov,mp4,m4a,3gp,3g2,mj2"
//videoInfo.Format.FormatLongName = "QuickTime / MOV"
//videoInfo.Format.StartTime = 0
//videoInfo.Format.Duration = 120 //seconds
//videoInfo.Format.Size = 2088470 //bytes
//videoInfo.Format.BitRate = 139231
//videoInfo.Format.ProbeScore = 100
//videoInfo.Format.Tags["encoder"] = Lavf57.76.100
//videoInfo.Streams[0].CodecType = "video" //Video, Audio
//videoInfo.Streams[0]...
1
Tino Hager