質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

10920閲覧

C# 動画ファイル時間取得方法

cotopii

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/01/26 08:33

###前提・実現したいこと
一度質問しましたが、解決する前に解決済にしてしまった為、もう一度質問致します。
ドラッグアンドドロップしてきた動画ファイルの再生時間を取得したいです。
再生中の秒数ではなく、その動画の最大の秒数です。
ドラッグアンドドロップはできますが、動画の時間取得の仕方が分かりません。
00:00.00 少数以下の秒数まで取得したいです。
お手数ですが、分かる方教えて頂けますでしょうか。

###前回教えて頂いたサイト
こちらのサイトを参考にすると良いと教えて頂きました。
http://stackoverflow.com/questions/38474590/getting-the-length-of-video-using-ffmpeg-ffprobe-is-not-working?answertab=active#tab-top

###試したこと
Shell32を使用すると秒数の取得が出来ましたが、少数以下が取得出来ないので×
ffmpegを導入しましたが、ffmpegからビジュアルスタジオに秒数の取得方法が不明
ffmpegではなくても良いので、何とか秒数を取得したい

###補足情報(言語/FW/ツール等のバージョンなど)
ビジュアルスタジオ2015 C# windows Form アプリケーション

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hikochang

2017/01/26 08:40

対応したいフォーマットなど記載下さい
guest

回答1

0

ベストアンサー

解決済みにされたC# 動画ファイルの時間取得のturbgraphics200さんの回答とおりで、
http://stackoverflow.com/questions/38474590/#answer-38494527
このJitender Kumarさんの回答にあるprivate static void GetVideoDuration()がそのまま使用できると思うのですが・・・

「そのまま使用できる」は語弊がありますね。
msを削除しているので削除内容にすると、durationに文字列でms含めた時間が入っていると思います。

string duration = proc.StandardOutput.ReadToEnd().Replace("\r\n", ""); // not Remove the milliseconds // duration = duration.Substring(0, duration.LastIndexOf("."));

string duration = proc.StandardOutput.ReadToEnd().Replace("\r\n", ""); // not Remove the milliseconds // duration = duration.Substring(0, duration.LastIndexOf("."));

投稿2017/01/26 08:52

編集2017/01/26 08:58
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cotopii

2017/01/26 09:29

有難うございます、試してみます。
cotopii

2017/01/27 07:11

試してみたところ、小数点第1までは取れていましたが、小数点第2までは取れませんでした。 例01:23.45 → 83.40000 出来れば83.45000と取得したいのですが、分かりませんでしょうか…。
Y.H.

2017/01/27 07:19

コマンドプロンプトで ffprobe.exe c:\temp\test.mp4 とした場合の出力でduration の値はどうなってるでしょうか? 基本的にffmpegのffprobe.exe を実行した結果から取得しているだけなので、コマンドプロンプトから実行した際に83.40000と表示されているのであれば、ffmpeg(ffprobe.exe)ではできないという結論になります。
cotopii

2017/01/27 07:40

コマンドプロンプトから実行した場合は正しい値が表示されていました。
cotopii

2017/01/27 07:43

現在のコードです。 string cmd = string.Format("-v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 {0}", moviename); Process proc = new Process(); proc.StartInfo.FileName = "ffprobe.exe"; proc.StartInfo.Arguments = cmd; proc.StartInfo.CreateNoWindow = true; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.UseShellExecute = false; if (!proc.Start()) { Console.WriteLine("Error starting"); return; } string duration = proc.StandardOutput.ReadToEnd().Replace("\r\n", ""); proc.WaitForExit(); proc.Close();
Y.H.

2017/01/27 08:11

ffprobe.exe --hide_banner -show_entries format=duration c:\temp\test.mp4 の場合はどうでしょうか? これで83.45000などと小数第2位以下までひょうじされるなら string cmd = string.Format("-v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 {0}", moviename); を string cmd = string.Format("-hide_banner -show_entries format=duration {0}", moviename); としてしまい、 後は無理やり durationの値をこんな感じで抜き出すとか。 (すみません、コード実行検証してないので間違いがあるかも。) string result = proc.StandardOutput.ReadToEnd().Replace("\r\n", " "); string tmp = result.Substring(result.IndexOf("duration=") + "duration=".Length); string duration =tmp.Substring(0,tmp.IndexOf(" ")-1);
turbgraphics200

2017/01/27 08:35

ffprobeのバージョンはいくつでしょうか。私の所有するffprobeはversion 3.1.4およびversion N-81285-gc1bfeda複数ありますが、両方ともにduration = "0:00:13.797167" と取得されます。
cotopii

2017/01/27 08:39

おおお! 小数第2以下まで取得することが出来ました! 本当に有難うございました。
Y.H.

2017/01/27 08:48 編集

turbgraphics200さん、ffmpeg(ffprobe)のバージョンによる挙動の差異も考えられますね。(cotopiiさんの使用されているバージョンのバグ?) cotopiiさん、正攻法を取るならffmpeg(ffprobe)のバージョンを替えてdurationのみ取得のほうがいいと思うので時間があったらやってみてください。
Y.H.

2017/01/27 08:52

cotopiiさん、解決されて何よりです。 同じことでつまずかれた方がこの質問にたどり着かれた時に 使用されているffmpeg/ffprobeのバージョンが質問に記載されていると 有意義な情報になるので追記いただけたらと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問