Flutter media_kit 動画再生で演奏時間を取得する

はじめに

以前 media_kit で動画再生を実装してみたら、とても簡単で素晴らしいと紹介したが、演奏時間を取得する必要があり迷走した話

前提

環境は前回と同様で、Desktop Windows 環境のみ

問題点

動画の総演奏時間の取得ができない!
player.stream.position、player.stream.duration から取得できない(正確には非同期呼び出しで返ってこない)

解決方法

LLM に相談して、方法を模索したが、media_kit 上では解決策を見つけられず!

演奏時間取得の為だけに別のパッケージを入れることにした
調べて見て、試しに flutter_media_info というパッケージを入れることにした(完全解決では無い妥協結果)

flutter_media_info 特徴

https://pub.dev/packages/flutter_media_info
flutter_media_info 0.0.3

まず現時点で最終変更が24月前 → ちょっと心配
Desktop Linux/MacOS/Windows に対応している
指定メディアの演奏時間しか取得できない(他の取得方法が紹介されていない)
取得できる情報が固定書式文字列のみ(ex. ’1 h 43 min’)

上記を踏まえて、まあ演奏時間取得のみと割り切って使う

使い方

pubspec.yaml に追加

  flutter_media_info: ^0.0.3
``

サンプル参照コード  
```dart
import 'package:flutter_media_info/flutter_media_info.dart';

    // flutter_media_info を使って動画総視聴時間を秒数で取得する
    final mi = Mediainfo.init();
    mi.quickLoad("対象動画ファイル.mp4");
    final movieDuration = mi.getInfo(MediaInfoStreamType.mediaInfoStreamVideo, 0, "Duration/String2");
    mi.close();
    mi.delete();
    print('Duration: ${movieDuration}');
    // Duration: 7 min 19 s
    // Duration: 1 h 43 min
    int seconds = _strTimeToSecond(movieDuration);
    print('seconds: $seconds');


    // flutter_media_info が返す時間情報を秒数に変換する
    static int _strTimeToSecond(String strTime) {
        if (strTime.isEmpty) {
            return 0;
        }
        // 1 h 43 min  or  7 min 19 s
        int seconds = 0;
        int pos = strTime.indexOf(" h");
        if (pos >= 0) {
            seconds += int.parse(strTime.substring(0, pos).trim()) * 60 * 60;
            strTime = strTime.substring(pos + 2).trim();
        }
        pos = strTime.indexOf(" min");
        if (pos >= 0) {
            seconds += int.parse(strTime.substring(0, pos).trim()) * 60;
            strTime = strTime.substring(pos + 4).trim();
        }
        pos = strTime.indexOf(" s");
        if (pos >= 0) {
            seconds += int.parse(strTime.substring(0, pos).trim());
        } else {
            // 1時間以上の場合、秒情報が欠落しているので最大秒数を加算する
            seconds += 59;
        }
        return seconds;
    }

1時間以上の動画では秒数が不明になる、文字列でしか取得できない、等の問題があるので注意!

まとめ

media_kit の出来が良かったので、こんな落とし穴があるとは…
解決方法も不十分で、モヤッとする思いも有るが、それに時間を掛ける余裕も無いし必要十分とも割り切れるのでこれで終了

タイトルとURLをコピーしました