301 Moved Permanently

Moved to https://vow.g.hatena.ne.jp/vow/

バグの上塗り

Most of the bugs are on the floor. — たいていのバグは床の上にいる

(続き)

Download: emPause.exe (PE/Win32 console Unicode, 3KB) [7z 2KB]

(FFmpeg方面の) mplayer のaudio出力をSPDIFに回して録音しようとする場合、デバイス初期化のタイミングで同期が切れてしまい、録音側で Din Unlock とかになって冒頭部分を取りこぼすことがあります。どちらかというとSPDIFの出力側がポカっぽい気がしないでもないですが、ともあれこれに対抗するには同期が回復するまで出力を一時停止して待つくらいしか手がありません。といっても mplayer にそんな妙に気の利いたオプションはありませんでして、仕方ないのでmplayerをslave駆動して外からpauseをかけてやることにします。

・・・が。

  • 最初から pause 状態でmplayerを起動する方法はありません。実際に再生が開始されるより前のタイミングで pause を叩き込んでおいても、最初の1フレームは確実に再生しやがります。
  • この発音は pause より前に mute 1 を叩き込むことで一応止められますが、そうすると今度はその後で再生を再開したときに最初の1フレーム分が欠落したままになることになります。
  • じゃあ seek 0 2 とかして巻き戻したらどうかというと、seek が発動する直前に溜め込んでいた1フレームを音にして吐き出さないと何がどうあっても気が済まないらしく、これまたどうしようもありません。
  • ならば seek が発動し終わった直後のタイミングで mute 0 すればいいかと思いきや、溜まっていたゴミフレームが出て行き終わったタイミングを拾う方法が存在しないので無理です。

とまあそういうわけなので最初の1フレームが行方不明になるのは諦めてください、ていうかそれ以前の問題として実は尻切れの方が酷いわけですが。それはもう伝統的なくらいに。(FFmpeg方面の) mplayer2 ではこの辺りの腐れ仕様も少しはマシになってたりするんですかね・・・。

使い方

emPause.exe 2000 mplayer.exe -noquiet -identify -msglevel all=4 -slave ...

最初の 2000 は pause が受理された後で再び叩き起こす前に Sleep する長さです (単位 msec)。そこから後はただひたすらmplayerコマンドラインなので適当に書いてください。-playlist 〜.m3u とか食わせても大丈夫です。

  • たぶんvideoは要らないので状況に応じて -novideo-vc null -vo null
  • audioが飛ぶときは -priority abovenormal -cache 4096 または他の -ao を試す
  • (特に.FLAっぽいflacで) コンテナの誤判定による暴走に悩まされた場合は -demuxer audio

で結局

Win32とかキモい!!