【開発途中版4 2024-03-17】
- シークなどで通信が中断された場合に1/16の確率で不完全な動画セグメントファイルが生成されていた問題を修正。
onTransferEnd(boolean completed)の引数を確認していないのが原因でした。
IllegalBlockSizeExceptionもこれが原因でした。
HlsCachingProcessor.javaを改変しながらコードを書いた時にcompleted引数には触れてないから役割が分かってなかった。
Hlsでは受信バイト数をカウントして完了したかどうかを見ていたから触れてないのだった。
- 未知のセグメントを受け取った場合にプレイリストを再スキャンする機能を追加。これによってキャッシュコンプリート処理不発を改善した。
原因は分からないけど対処を追加しました。CacheManager.java#addCachedSegmentAndCheckComplete
プレイリストが揃っていない状態でキャッシュ済セグメントを追加する要求なんて来るはずないんだけれども。
何か見落としている。
- showCachingオプションを追加。trueにすると"caching smXXX"というメッセージがセグメントを受信するごとに出ます(dmc-hlsはではまだ出ません)。デフォはfalse。
デバッグ用にログを仕込んでたんだけれどもリリース版でも欲しい機能だからオプションにしました。
- 数日使ってみて重大なバグがなければ、一般ユーザーにもNicoCacheを勧められる扱いにします。
- セグメント通信中に206(partial content)レスポンスや304(変更ナシ)が返ってくる。そんな要求はしていないはずなのに。とはいえ正常通信も来ているからこれらは致命的なエラーではない。
>>159667>ソースもちょっとづつ読んでますが、まだまだ挙動がよくわからないです。大枠でいうとどこがわかりにくいです?
Hls処理の真似して書いているだけで自分もブラックボックスな理解がかなりあります。
変数にも関数にもクラスにも役割・目的・立ち位置はコメントに残すようにしているのだけれども、試行錯誤中で抜けてるところがあります。
今回になって値を運ばせるために一回ブラウザに送り出してから、またプロキシ側に値を戻すようなことをした(nicocachenl_domandcvikey)ので、後から読む人はきっと大変だと思う。
メモ。
ffmpeg -i 入力動画 -c:v copy -c:a copy -f hls -hls_time 6 -movflags cmaf -hls_segment_type fmp4 -hls_playlist_type vod -hls_segment_filename "%d.m4s" 'master.m3u8'
この方法で作ったmaster.m3u8をニコニコ動画のプレイヤーは再生出来る。(webmを入力とする場合も再生出来る)
昔のmp4キャッシュやflvキャッシュが使える可能性が出来ました。