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

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

新規登録して質問してみよう
ただいま回答率
87.20%
.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

解決済

MediaElementとSliderでの動画再生アプリで、スマートに再生時間の取得・設定がしたい

tuyudaku
tuyudaku

総合スコア70

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1回答

0評価

1クリップ

972閲覧

投稿2021/10/13 08:08

現在動画再生アプリを作成しています。

MediaElementで動画の再生
Sliderでシークバーを実装しています。
また、00:10:15/00:30:00というような感じで、TextBoxで再生中動画の総時間と現在再生中の時間を表示しています。
他にも再生ボタン等もありますが、今回の質問には関係ないので割愛します。

MediaElementの再生時間(MediaElement.Position)の取得はBindingに対応していないため、
ビヘイビアを使用して、500msのタイマーで定期的にPositionを取得するようにしています。
また、Sliderによる再生箇所の変更・ユーザー指定による指定箇所へのジャンプの機能を実装するためにもビヘイビアを使用しています。

C#

/// <summary> /// 再生時間バインド用プロパティ /// </summary> public static readonly DependencyProperty MediaPositionProperty = DependencyProperty.RegisterAttached( "MediaPosition", typeof(long), typeof(MediaControlBehavior), new PropertyMetadata(0L, OnMediaPositionPropertyChanged)); /// <summary> /// MediaPositionPropertyのゲッター /// </summary> /// <param name="target"></param> /// <returns></returns> public static long GetMediaPosition(DependencyObject target) { return (long)target.GetValue(MediaPositionProperty); } /// <summary> /// MediaPositionPropertyのセッター /// </summary> /// <param name="target"></param> /// <param name="value"></param> public static void SetMediaPosition(DependencyObject target, long value) { target.SetValue(MediaPositionProperty, value); } /// <summary> /// 再生時間変更時処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void OnMediaPositionPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { var mediaElement = GetMediaElement(sender); mediaElement.Position = TimeSpan.FromSeconds(GetMediaPosition(sender)); } /// <summary> /// タイマーTick処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void TimerTick(object sender, EventArgs e) { SetMediaPosition(_mediaElement, (long)_mediaElement.Position.TotalSeconds); }

このMediaPositionPropertyに対してViewModelで定義したプロパティをBindingすることで再生位置の取得を行っています。
また、SliderのValueに同じプロパティをBindingすることで、MediaElementの再生位置をそのままSliderに反映させて、
Sliderの位置を変えたときにMediaElementに反映できるようにしています。

C#

// VM----------------------------------------------------------------- /// <summary> /// 再生箇所 /// </summary> public long MediaPosition { get => _mediaPosition; set => SetProperty(ref _mediaPositionManager, value); } // VM----------------------------------------------------------------- // View--------------------------------------------------------------- <MediaElement x:Name="MediaPlayer" Source="{Binding MediaSource, Mode=OneWay}" b:MediaControlBehavior.MediaPosition="{Binding MediaPosition, Mode=TwoWay}"> <Slider x:Name="SeekBar" Value="{Binding MediaPosition, Mode=TwoWay}"/> // View---------------------------------------------------------------

ただし、この実装方法だと少し気持ちの悪い動きになってしまいます。
タイマーによる定期的なMediaElement.Positionの確認時、ビヘイビアで定義したMediaPositionPropertyに対して代入することで、
BindingされているVMのMediaPositionに対して変更を行っていますが、タイマーによる再生位置の値がMediaPositionに代入されると、
その変更通知がビヘイビアに戻ってきてしまいMediaElement.Positionに対して代入を行ってしまいます。
この無駄な動きが気持ち悪い上に、再生時間が多少前後してしまったりしてしまうため動作に影響も出てしまっています。

動画再生アプリを実装する際にシークバーの実装はよくあることだとは思うのですが、皆さんはどのようにして実装を行っているのでしょうか?
どのように改善したらいいのか、教えていただけないでしょうか?
よろしくお願いいたします。

長くなってしまった上に、質問したいこともうまくまとめられていない気がしますが、
足りない情報があればすぐに捕捉させていただきますのでよろしくお願いします。

言語:C#(.NET 5.0)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです