web-dev-qa-db-ja.com

mp4、wmv、flv、movビデオからビデオの長さを取得する方法

わかった。実際に私は主にmp4形式が必要です。しかし、他のタイプでも同様に取得できる場合、それは素晴らしいことです。ファイルの継続時間を読むだけです。 C#4.0でこれを行うにはどうすればよいですか?

だから私が必要なのは、このビデオのようなものです:13 minutes 12 seconds

サードパーティのexeも使用できます。ファイルに関する情報をテキストファイルに保存するように。そのテキストファイルを解析できます。

ありがとうございました。

20
MonsterMMORPG

DirectShow.NETラッパーライブラリを介して、DirectShow API MediaDetオブジェクトを使用できます。 ビデオの長さの取得 のサンプルコードをご覧ください、 get_StreamLength 秒単位で期間を取得します。これは、WindowsにMPEG-4デマルチプレクサーがインストールされていることを前提としています(7より前のWindowsにはサードパーティのコンポーネントが必要です。同じことが別の answer by cezor 、ただし、コンポーネントを自由に再配布できます)。

12
Roman R.

Windows Media Playerを使用することもできますが、要求したすべてのファイルタイプはサポートしていません

using WMPLib;

public Double Duration(String file)
    {
        WindowsMediaPlayer wmp = new WindowsMediaPlayerClass();
        IWMPMedia mediainfo = wmp.newMedia(file);
        return mediainfo.duration;
    }
}
12
nickknissen

この回答 Shell32のP/Invokeについて Windows API Code Pack 共通のWindows Vista/7/2008/2008R2 APIにアクセスすることを思い出しました。

含まれているサンプルのPropertyEditデモを使用して、Shell32 APIが期間などのさまざまなメディアファイルプロパティを取得するのを理解するのは非常に簡単でした。

適切なデマルチプレクサのインストールには同じ前提条件が適用されると思いますが、Microsoft.WindowsAPICodePack.dllおよびMicrosoft.WindowsAPICodePack.Shell.dllへの参照と次のコードを追加するだけでよいため、非常に簡単でした。

using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

using (ShellObject Shell = ShellObject.FromParsingName(filePath))
{
    // alternatively: Shell.Properties.GetProperty("System.Media.Duration");
    IShellProperty prop = Shell.Properties.System.Media.Duration; 
    // Duration will be formatted as 00:44:08
    string duration = prop.FormatForDisplay(PropertyDescriptionFormatOptions.None);
}

他のもの

MPEG-4/AACオーディオメディアファイルの一般的なプロパティ:

System.Audio.Format = {00001610-0000-0010-8000-00AA00389B71}
System.Media.Duration = 00:44:08
System.Audio.EncodingBitrate = ?56kbps
System.Audio.SampleRate = ?32 kHz
System.Audio.SampleSize = ?16 bit
System.Audio.ChannelCount = 2 (stereo)
System.Audio.StreamNumber = 1
System.DRM.IsProtected = No
System.KindText = Music
System.Kind = Music

使用可能なメタデータを探している場合、すべてのプロパティを反復処理するのは簡単です。

using (ShellPropertyCollection properties = new ShellPropertyCollection(filePath))
{
    foreach (IShellProperty prop in properties)
    {
        string value = (prop.ValueAsObject == null) ? "" : prop.FormatForDisplay(PropertyDescriptionFormatOptions.None);
        Console.WriteLine("{0} = {1}", prop.CanonicalName, value);
    }
}
10
nekno

MediaInfo を使用すると、メディアファイルに関する多くの情報が得られます。
CLIがあり、コードから使用して必要な情報を取得できます。
このリンク をご覧ください。

5
Marco

FFMPEGプロジェクトには、マルチメディアファイルについて必要な情報を提供し、適切にフォーマットされたJSONで情報を出力できるffprobeというツールがあります。

例については、 この回答 をご覧ください。

3
Paulo Fidalgo

あなたはFFMPEGを探していると思う- https://ffmpeg.org/

この質問でそれらについて読むことができるいくつかの無料の代替もあります- 。netでFFmpegを使用しますか?

   FFMpeg.NET
   FFMpeg-Sharp
   FFLib.NET

fFMPEGを使用して期間を見つける例については、このリンクをご覧ください- http://jasonjano.wordpress.com/2010/02/09/a-simple-c-wrapper-for- ffmpeg /

        public VideoFile GetVideoInfo(string inputPath)
        {
            VideoFile vf = null;
            try
            {
                vf = new VideoFile(inputPath);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            GetVideoInfo(vf);
            return vf;
        }
        public void GetVideoInfo(VideoFile input)
        {
            //set up the parameters for video info
            string Params = string.Format("-i {0}", input.Path);
            string output = RunProcess(Params);
            input.RawInfo = output;

            //get duration
            Regex re = new Regex("[D|d]uration:.((\\d|:|\\.)*)");
            Match m = re.Match(input.RawInfo);

            if (m.Success)
            {
                string duration = m.Groups[1].Value;
                string[] timepieces = duration.Split(new char[] { ':', '.' });
                if (timepieces.Length == 4)
                {
                    input.Duration = new TimeSpan(0, Convert.ToInt16(timepieces[0]), Convert.ToInt16(timepieces[1]), Convert.ToInt16(timepieces[2]), Convert.ToInt16(timepieces[3]));
                }
            }
       }
3
Dor Cohen

Windows Media Playerコンポーネントも使用して、ビデオの長さを取得できます。
次のコードスニペットが役立つかもしれません:

using WMPLib;
// ...
var player = new WindowsMediaPlayer();
var clip = player.newMedia(filePath);
Console.WriteLine(TimeSpan.FromSeconds(clip.duration));

wmp.dllフォルダーに存在するSystem32の参照を追加することを忘れないでください。

2
Rish

NReco.VideoInfo library が最良のオプションであり、上記のいくつかよりもはるかに簡単であることがわかりました。ライブラリにファイルパスを指定するだけで、メタデータが生成されます。

var ffProbe = new FFProbe();
var videoInfo = ffProbe.GetMediaInfo(blob.Uri.AbsoluteUri);
return videoInfo.Duration.TotalMilliseconds;
1
James Mundy

私は同じ問題を抱えていたため、ffprobe Alturos.VideoInfo のラッパーを作成しました。 nugetパッケージをインストールするだけで使用できます。 ffprobe バイナリも必要です。

PM> install-package Alturos.VideoInfo

var videoFilePath = "myVideo.mp4";

var videoAnalyer = new VideoAnalyzer("ffprobe.exe");
var analyzeResult = videoAnalyer.GetVideoInfo(videoFilePath);

var duration = analyzeResult.VideoInfo.Format.Duration;
0
Tino Hager
StreamReader errorreader;
string InterviewID = txtToolsInterviewID.Text;

Process ffmpeg = new Process();

ffmpeg.StartInfo.UseShellExecute = false;
ffmpeg.StartInfo.ErrorDialog = false;
ffmpeg.StartInfo.RedirectStandardError = true;

ffmpeg.StartInfo.FileName = Server.MapPath("ffmpeg.exe");
ffmpeg.StartInfo.Arguments = "-i " + Server.MapPath("videos") + "\\226.flv";


ffmpeg.Start();

errorreader = ffmpeg.StandardError;

ffmpeg.WaitForExit();

string result = errorreader.ReadToEnd();

string duration = result.Substring(result.IndexOf("Duration: ") + ("Duration: ").Length, ("00:00:00.00").Length);
0
Koby Douek