わかった。実際に私は主にmp4形式が必要です。しかし、他のタイプでも同様に取得できる場合、それは素晴らしいことです。ファイルの継続時間を読むだけです。 C#4.0でこれを行うにはどうすればよいですか?
だから私が必要なのは、このビデオのようなものです:13 minutes 12 seconds
サードパーティのexeも使用できます。ファイルに関する情報をテキストファイルに保存するように。そのテキストファイルを解析できます。
ありがとうございました。
DirectShow.NETラッパーライブラリを介して、DirectShow API MediaDet
オブジェクトを使用できます。 ビデオの長さの取得 のサンプルコードをご覧ください、 get_StreamLength
秒単位で期間を取得します。これは、WindowsにMPEG-4デマルチプレクサーがインストールされていることを前提としています(7より前のWindowsにはサードパーティのコンポーネントが必要です。同じことが別の answer by cezor 、ただし、コンポーネントを自由に再配布できます)。
Windows Media Playerを使用することもできますが、要求したすべてのファイルタイプはサポートしていません
using WMPLib;
public Double Duration(String file)
{
WindowsMediaPlayer wmp = new WindowsMediaPlayerClass();
IWMPMedia mediainfo = wmp.newMedia(file);
return mediainfo.duration;
}
}
この回答 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);
}
}
FFMPEGプロジェクトには、マルチメディアファイルについて必要な情報を提供し、適切にフォーマットされたJSONで情報を出力できるffprobeというツールがあります。
例については、 この回答 をご覧ください。
あなたは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]));
}
}
}
Windows Media Playerコンポーネントも使用して、ビデオの長さを取得できます。
次のコードスニペットが役立つかもしれません:
using WMPLib;
// ...
var player = new WindowsMediaPlayer();
var clip = player.newMedia(filePath);
Console.WriteLine(TimeSpan.FromSeconds(clip.duration));
wmp.dll
フォルダーに存在するSystem32
の参照を追加することを忘れないでください。
NReco.VideoInfo library が最良のオプションであり、上記のいくつかよりもはるかに簡単であることがわかりました。ライブラリにファイルパスを指定するだけで、メタデータが生成されます。
var ffProbe = new FFProbe();
var videoInfo = ffProbe.GetMediaInfo(blob.Uri.AbsoluteUri);
return videoInfo.Duration.TotalMilliseconds;
私は同じ問題を抱えていたため、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;
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);