C#とWPFとOpenCVSharpでTrimViewer開発日記 0.8.1c 「終端フレームスキャンテスト中」

c#

ちょいちょい切れのいいところでアップデート公開
ちょいちょいです(^◇^;

プロファイル「一時ファイルを削除せずに残す」オプション設定の利用を推奨

TrimViewerのアップデート報告

ガラクタツール置き場はこちら→

nln:★Idea Library★(永遠のβ)
■ ここ最近の目玉(ver0.7.9以降)
■ Ver 0.80bでの変更点

・TSファイルを指定した時に前の編集情報の初期化が一部抜けていたのでリセットするようにした
(「一時ファイル」の情報が消えていなかったためtempファイルを参照してしまうバグの修正)

■ Ver 0.80cでの変更点

・デバッグ中心です。一部TestCode追加。
・終端フレームのマージンでごまかしていたところをまじめに実装。それに伴う修正
※MainWindowで [Frame Count:176,370] の場合、ViewerWindowの表示上のフレームは [0-176,369]になります(0番フレームが1フレーム目の為)
・終端フレーム外へのアクセス時のエラー処理を追加(終端マージン0対応)

・個人的メモ:ver0.60以前のOLDコードの削除
・スライドバーの終端処理のバグ修正
・連続更新処理のが正しく動かないバグの修正
(デバッグ用の固定値が混入してしまいましたm(__)m)

[TMSR6すり合わせの準備]
・VideoCaptureAPIにて取得するフレーム数とTMSR6で出力したフレーム数を元に整合性を取りました
(数本見たところ総フレーム数が±1くらいずれるところまで接近)

・フレームが取得できない場合、表示が移動しないように修正(R-CTRL+Endキーなど)
(終端マージンがほぼいらなくなりましたが、R-CTRL+Endキーの移動がエラーでキャンセルされる場合があるので、設定は残しておきます)
エラー発生時もR-CTRL+Endキーを押しっぱなしにすることで、後ろから読めるフレームを探します。(いままで終端マージンとしていた部分のスキャン)
この移動した終端フレームと総フレーム数の差を「終端マージン」に入れることで終端へアクセスする手間が減ります

・フレーム取得のエラー時の帰値が古いバージョンのままだったため、拾えずにアクセスして強制終了していた。鵜呑みにしてコピペした綺麗すぎるソースの処理が古いソースだった。OpenCVのver2サンプルソースをそのままver4で使ってたので見直し。
たぶん、かなり、落ちにくくなったです・・・ご迷惑おかけしましたm(__)m

[終端フレームの終端マージンとは]
・パケット単位で録画していくEDCB等を使ったTSファイルの場合、動画フレーム数と動画時間が違っている場合がほとんどなので、通常は60f(2秒)程度除外することで動画の外へフレームを取りに行くことが回避できます

[TMSR6を使う前提の作業や注意点]
・OpenVC自体がFFMpeg処理系なので必然的にOpenCVSharpも同じ系統の処理になります
・TMSR6のkeyframeを使う場合は、動画は生TSではなく「TMSR6で出力した動画」をAmatsukaze(FFMpeg処理系)に食わせる事。
1)生TSの場合、AmatsukazeCM解析とTMSR6の出力フレーム数が異なります
2)TMSR6で出力した動画を使わない場合(keyframeのみ保存した場合)
 ・一度Viewerを開きフレームのずれを確認する(TrimTopの移動量を調べる)
 ・MainWindowに戻り「BIAS」に上記のずれているフレーム数設定してViewerを開き直してください
 ・開始Trimと最終Trimで範囲外のフレームが必ず切れるので調整する事

・「TMSR6で出力した動画」を前提に機能を作成
・[.ts.trim.avs]ファイルがない場合[.keyframe]を読み込みテストを行います
・コメント行に使われる”#”の行や、数値の後ろに数値以外の文字がある場合は読み飛ばします
・TMSR6でCM解析したデータをキーフレームに設定して、.keyframeファイルに保存→TrimViewerで読み込むと大変なので、TMSR6で最低限のキーフレームに整理してからの方が後の処理が楽です
・全範囲をkeyframeにある数値行の値で分割したTrimを作成します(開始は0フレームからに)
現状では後からキーフレームを追加して後ろのTrim範囲を反転等の処理も考えられますが、本来のAmatsukazeのログからのTrimを扱う上で優先度が高い機能ではないかなと
※CM/本編の判定ができない為、すべての範囲を登録します。全登録してユーザーに処理を任せますm(__)m

気が付けば、かなりの大改修になってます。
デバッグが進むまで、生暖かく見守ってください(^◇^;

■ Ver 0.81aでの変更点

・”.mp4″/”.mkv”もDrag&Dropで開けるようにした(一時ファイルテストの為)
・TS以外のTSAccessCheckはスキップします
・ViewerWindowの終了時MessageBoxをSkipするCheckBoxを追加(Option)
・log内のファイルパスにTSが見つからない時、succeeded→failedの順でTSファイルを探しに行きます
・.keyframeの内容をTrimのTop/Endとして読み込むCheckBoxを追加(Option)

話題が続きそろそろ自治厨が暴れると思いますので、バグ取りに専念して大人しくします。半分の機能も試せてない(^◇^;
荒れたら「ソースは全部ネットにあるから作って」と(笑)

■ Ver 0.81bでの変更点

——————-
バグ報告ありがとうございますm(__)m

・動画の直接読み込み時に行うTrim自動生成の時に、終端マージンが2度引かれていたので修正(マージン60だと120引かれていた)
・.keyframeファイルがUTF-8だったでの修正(まだ仕様がつかめていないです。手探りです)
・CM解析ログの選択パスは[Amatsukaze\data\checklogs]の中の.txtファイルが対象です

・終端フレームを指定する場合は、Optionで終端マージン0に設定、CTRL+ENDで終端フレームにジャンプします
※エラーが起きた時は繰り返し押すことで -1 フレームずつ探査します(デバッグ用)

★保存周りのスクラップ&ビルドを行いました。俗にいう「オブジェクト指向」を完全に無視(笑)
(Viewerの保存処理で終了確認やMainWindowに戻った時の処理の整合性が取れなくなってしまっため新コードに)

[ViewerWindow]
◆.trim.avsファイルの保存を CTRL+A → CTRL+S に変更(利用者が少ないうちに、メイン画面に合わせることにした)
◆サムネイルのスクロール切替を S → T に変更(上記キー変更に伴う移動)

・Trimの修正フラグは読込時の生成/保存情報との比較に変更
・Trim範囲の追加/削除位置以降のTrimに修正フラグが立つのは正常です

[MainWindow]
・ViewerWindowのTrim編集状態を継続する仕様に変更(更新反映時)
・ViewerWindowを閉じた時、avs保存状況に合わせて各種処理を変更
・ViewerWindowを閉じ更新反映時、Trim編集状態を保持し.trim.avs が保存されるまでリセットしない

取り急ぎのバグ修正からm(__)m

■ Ver 0.81cでの変更点

バグ・不都合修正が続きますm(__)m

・操作時のBeep音をオンオフできるように設定を増やした(Option)
※ポップアップウィンドウのMessageBox呼び出し時の警告音は鳴りますm(__)m

[ViewerWindow]
・追加時のChangeフラグを追加フレームのみに(以前の仕様を再現)
0.8.1bの違和感の修正→「Trim範囲の追加/削除位置以降のTrimに修正フラグが立つのは正常です」
これも、注意書きをした時点で違和感があった^^;

・TrimActivationキーをZからAに変更(非選択Trimを選択)
(今後予定の「CTRL+Z」の為 Zキーを空けたm(__)m)

[MainWindow]
・Trimを新規作成する場合、0フレームからアクセスできる終端フレームをTrimに設定します
終端マージンが60以上の場合→OpenCVSharpで取得するTotalFrameCountから計算します
Trim(0,終端フレーム):終端フレーム[ TotalFrameCount – 終端マージン – 1 ](-1 は 0フレームから開始の為)

(新)
※終端マージンが60未満の場合→アクセスできる終端フレームを後ろからスキャンし再設定します

 新規作成する場合=Logファイルからの作業開始ではない=一時ファイルが使えない
 一時ファイルがない状態なので終端フレームへのアクセスが担保されない
 (TMSR6出力では0~2フレーム前後の解析誤差はあるものの、ほぼ終端フレームにアクセスできる)
 TMSR6出力使用時でも終端マージンは0ではなく2にした方がストレスは貯まりません
 →TMSR6でTSをカット&出力も前後だけ切ってAmatsukazeのCM解析に食わせる方が安全
 →(Amatsukazeで取り扱うTSの内容の都合上、CMカットなどでつなぐのは得策ではない)
 ◆最後に「全フレームをエンコード」する場合はTrimを使わない。当たり前なんですが、結構忘れますよね(笑)

 終端マージンを変更可能にしたことで、終端フレーム(CTRL+End)に飛んだ時に、アクセスエラーが出るようになった
 終端マージンが60未満の場合最終フレームから1フレームずつアクセステストを行い、途中で壊れていても取得できるフレームを探します
 →Viewer起動すると中断されます

※[既知のバグ]
音声フォーマットの切替がある場合の直接読み込みや、解析では切替が無くてもSeekに時間のかかるファイルの場合正常動作しません
(フレームを読みに行ったまま帰ってこないので(^◇^;)

[aac @ 0000027a7d236980] Inconsistent channel configuration.
[aac @ 0000027a7d236980] get_buffer() failed

この手のエラーはOpenCVSharpの先のOpenCVのさらに先のFFMpegになるので、別の回避策が必要。
「OpenCVなんで音声触れなくていいのに」とみんな思っていることでしょう(^◇^;
対策されたたのに直らず、軽く6年くらいほっとかれてる感じでしょうか…Google先生でTopに来るということはみんなハマってる(笑)
https://github.com/mpv-player/mpv/issues/1782

これを解決するまでアップは保留っすな。
と、おもいつつ。
6時間ほど新しい情報をあさったものの私の力では無理かも(笑)
基本は「一時ファイル保存」を使う!(逃げ

あ、今までと変わらないから気に留めるまでもなく‥
音くらいは止めれるかなっと。メッセージボックスの音が消せない。
そのためにウィンドウ作るほどこだわってもいないので、許してもらおう(^◇^;

今更ながらGitのリポジトリ管理始めました(ここまで大事になるとは思っていなかったので^^;
TortoiseSVNもめんどくさくて10年前から使ってないので、勉強せずに行き当たりばったり使ってます
突然どこかに汚いソースが出回るときは笑ってくださいヘ(゚∀゚ヘ)アヒャ


—-呪いのメッセージ…
—-正常(ワーニングも出るけど)
[mpeg2video @ 000001bebf315840] Invalid frame dimensions 0x0.
[mpeg2video @ 000001bebf315840] Invalid frame dimensions 0x0.
[mpeg2video @ 000001bebf315840] Invalid frame dimensions 0x0.
[mpeg2video @ 000001bebf315840] Invalid frame dimensions 0x0.
overread 9
[mpeg2video @ 000001bebf315840] Warning MVs not available

—-エラー(aacでこけてる…音声はスルーしてよ!)
[aac @ 0000027a74ef7b00] Inconsistent channel configuration.
[aac @ 0000027a74ef7b00] get_buffer() failed
[aac @ 0000027a74ef7b00] Inconsistent channel configuration.
[aac @ 0000027a74ef7b00] get_buffer() failed
[aac @ 0000027a7d7a0040] Inconsistent channel configuration.
[aac @ 0000027a7d7a0040] get_buffer() failed
[aac @ 0000027a7d7a0040] Inconsistent channel configuration.
[aac @ 0000027a7d7a0040] get_buffer() failed
[aac @ 0000027a7d370880] Inconsistent channel configuration.
[aac @ 0000027a7d370880] get_buffer() failed
[aac @ 0000027a7d370880] Inconsistent channel configuration.
[aac @ 0000027a7d370880] get_buffer() failed
[aac @ 0000027a74e7d100] Inconsistent channel configuration.
[aac @ 0000027a74e7d100] get_buffer() failed
[aac @ 0000027a74e7d100] Inconsistent channel configuration.
[aac @ 0000027a74e7d100] get_buffer() failed
[aac @ 0000027a7d235040] Inconsistent channel configuration.
[aac @ 0000027a7d235040] get_buffer() failed
[aac @ 0000027a7d235040] Inconsistent channel configuration.
[aac @ 0000027a7d235040] get_buffer() failed
[aac @ 0000027a7d236980] Inconsistent channel configuration.
[aac @ 0000027a7d236980] get_buffer() failed
[aac @ 0000027a7d236980] Inconsistent channel configuration.
[aac @ 0000027a7d236980] get_buffer() failed
—-

■ デバッグに疲れて現実逃避↓

未来を見てみたいと思わないか!?(笑)
・終端の自動吸着(自動で有効フレームを探す):終端マージンを減らすとEndキーで移動できないフレームが指定される(データがないフレームにアクセスに行く)
→いまここ

・頭の片隅に、シーンチェンジ検出とCTRL+Zの2大巨壁が、が…
・操作で一番多いのが、左右キーをフレーム選択。この作業が多い。サムネイルが30frame単位なので最大29フレーム見る事に…
・30frame以下の表示&指定もありかなと。かなりのPCスペックが必要ですが…
・Eキーで追加バーを表示、Q/Wでシーンチェンジ検索したい
・JPEGの圧縮率が固定のままだ…
・連続再生、サムネイル、先読み(^_^)v
やるとは言っていない!ヽ(´`)ノ フッ・・・!

有料ソフトではないので、もっとこうなんというか、コレダ!!的な決め打ちのとっつきにくい角が残った方がフリーソフトっぽくて好きなんですが…
年ですなぁ(笑)


その他開発中のメモφ(..)メモメモ

●Struct→Classにしただけなので使いきれていない→もったいない。
が、やろうとすると決め打ちでデータにアクセスしている部分がフルスクラッチに近いのでバグを生むだけのような…でも今後の修正が楽になりそうな気配もしないでもない
心が穏やかな時に、お金と時間が自由になったら・・・(^◇^;

φ(..)メモメモ
(名前もあしたくないアレの確実な解説策)
大本のmpg作成部分(一時ファイル作成)を組み込むしかないかも…→一時ファイル利用で実装&回避
アレが時間かかるから直接読みたいわけで。本末転倒^^;

これがまた本編にCMがない放送で起きやすい!前後切るだけなのに。前後を切ると言えば、、、

・MurdocCutter(GOP単位):GOP切断位置によりうまくいかない場合もある
・TMSR6(フレーム単位):有料ソフト、先頭からGOP単位の倍数で最大300フレームくらいのTFF/BFF反転が起こる場合がある
 (エンコード時先頭の解像度が半分に^^;)
結局、別ファイルに書き出すならエラーがない場合も毎回書き出すことになるので不便ですよね…

・DGIndex などの高速MPEG2アクセスを使う手もあるが、フレーム番号のずれを解消する手段がない→×
・そもそもC++が使えない(覚える気力の無い)時代遅れの中の人なのでデバッグができません。やれよ!勉強しろよ→×(笑)

実は…フレーム取得ができても内部ではワーニングだらけだったり。
TSと相性が悪いFFMpeg。というか海外産のコードは日本のガラパゴスMPEG2に興味がないヘ(゚∀゚ヘ)アヒャ

(~0~)ネムイ
TSがパケット単位で保存されているという夢の前提条件が欲しいよ!
そして最初から最後まで音声のストリーム数が変わらない奴で…字幕の有無も固定で…要するにフォーマット変更がない奴で!
そんな夢を見た…

C#のコード書けよって声も、ソース出せよって声も。
音止めるだけで5ファイル(ほぼ全ソースだよね…)も修正してるなんて、生産効率悪いソースなんて参考にしちゃダメっす(^◇^;
いやいやこの程度なら私のソース読むよりネットで拾った方が早いですって、だって私も拾って繋いでるだけなんですから(笑)