プログラムでファイルのビデオの長さを取得する方法の簡単な例を見つけるのに苦労しています。多くの人が、このライブラリ/ラッパーなどを使用すると言いますが、その方法は言いません。 ffmpegをダウンロードしましたが、実際に使用する方法がわからず、ビデオの長さを取得するために使用する方法の例がないようです。それを使用してビデオを変換する方法はわかりますが、単にビデオの長さを知りたいだけです。他のすべての情報は重要ではありません。
これを簡単に行う方法はありますか?C#、Python、Javaなど、ビデオファイルの長さを示す文字列を返すだけです。
可能であれば例を挙げてください。前もって感謝します!
Wmv、avi、mp4、mpegなどの標準ファイル形式を想定します。メタデータがあるもの。
次に例を示します。
using DirectShowLib;
using DirectShowLib.DES;
using System.Runtime.InteropServices;
...
var mediaDet = (IMediaDet)new MediaDet();
DsError.ThrowExceptionForHR(mediaDet.put_Filename(FileName));
// find the video stream in the file
int index;
var type = Guid.Empty;
for (index = 0; index < 1000 && type != MediaType.Video; index++)
{
mediaDet.put_CurrentStream(index);
mediaDet.get_StreamType(out type);
}
// retrieve some measurements from the video
double frameRate;
mediaDet.get_FrameRate(out frameRate);
var mediaType = new AMMediaType();
mediaDet.get_StreamMediaType(mediaType);
var videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader));
DsUtils.FreeAMMediaType(mediaType);
var width = videoInfo.BmiHeader.Width;
var height = videoInfo.BmiHeader.Height;
double mediaLength;
mediaDet.get_StreamLength(out mediaLength);
var frameCount = (int)(frameRate * mediaLength);
var duration = frameCount / frameRate;
私が見つけた最も簡単で完璧な解決策は、 MediaToolkit nugetパッケージを使用することです。
using MediaToolkit;
// a method to get Width, Height, and Duration in Ticks for video.
public static Tuple<int, int, long> GetVideoInfo(string fileName)
{
var inputFile = new MediaToolkit.Model.MediaFile { Filename = fileName };
using (var engine = new Engine())
{
engine.GetMetadata(inputFile);
}
// FrameSize is returned as '1280x768' string.
var size = inputFile.Metadata.VideoData.FrameSize.Split(new[] { 'x' }).Select(o => int.Parse(o)).ToArray();
return new Tuple<int, int, long>(size[0], size[1], inputFile.Metadata.Duration.Ticks);
}
私は少し異なる方法でビデオの長さを取得しようとしました:
実際にはWindowsMedia Playerコンポーネントも使用して、ビデオの長さを取得できます。
次のコードスニペットは皆さんを助けるかもしれません:
using WMPLib;
// ...
var player = new WindowsMediaPlayer();
var clip = player.newMedia(filePath);
Console.WriteLine(TimeSpan.FromSeconds(clip.duration));
wmp.dll
フォルダーに存在するSystem32
の参照を追加することを忘れないでください。
-iフラグを使用すると、ffmpegでの長さなど、さまざまな種類のビデオ形式に関するあらゆる種類の情報を取得できます。
ffmpeg -i videofile.whatever
C#でffmpefをラップできるNiceライブラリが必要な場合は、 MediaHandlerPro を使用できます。
私は最近、ColdFusionとFFMpegの小さないとこであるFFProbeを使用して、私が抱えていた同様の問題の解決策を見つけました...
ColdFusionを使用してビデオファイルの長さを取得する方法はありますか?
FFProbeにはshow_streams引数があり、返された出力内の初期ストリームにかなりの量の情報をプッシュします。ビデオの幅、高さ、長さを含む...
「ffprobe.exe-show_streamstestFile」に相当するものを実行するためのC#の構文についてはよくわかりませんが、それを理解したら、受け取った出力から必要な情報を解析できると確信しています。
ffprobeは、ffmpegプロジェクトのコンパニアンツールです。さまざまなファイル形式から情報を提供するだけでなく、JSON形式で出力して解析を容易にすることもできます。
JSON出力の例については、これを確認してください answer 。