2022/02/12(土)春M(SpringM)で「0による浮動小数点数除算」
2022/02/12 25:22
[対象操作]
・ファイル削除
・コンテキストメニュー呼び出し
一度ダイアログが出てしまうと、プロセスがファイルハンドルを掴みっぱなしになってしまうようで、
SpringMのプロセスを削除するまでそのファイルは操作ができない。
うかつに操作しに行くと、そのプロセスがハングすることもある。
発生するファイルの条件を調べたところ、字幕付きのmp4ファイルで何らかの理由で字幕streamがデータ無しになっている場合に発生するようだ。
ffprobeで調べるとこんな感じ。
$ ffprobe.exe -select_streams s -show_streams -loglevel error "***.mp4" [STREAM] index=2 codec_name=mov_text codec_long_name=MOV text profile=unknown codec_type=subtitle codec_time_base=0/1 codec_tag_string=tx3g codec_tag=0x67337874 width=704 height=396 id=N/A r_frame_rate=0/0 avg_frame_rate=0/0 time_base=1/1000000 start_pts=0 start_time=0.000000 duration_ts=0 duration=0.000000 bit_rate=N/A max_bit_rate=N/A bits_per_raw_sample=N/A nb_frames=1 nb_read_frames=N/A nb_read_packets=N/A ~ 省略 ~ [/STREAM]これで、duration_ts=0になっているファイルが発生条件ぽい。
字幕でなくてもvideoやaudioがduration_ts=0の場合もおそらく発生すると思われる(そのようなファイルが手元にないので未検証)。
とりあえず、オリジナルのmp4を破壊してよいのであればdurationが0のストリームを破棄してやれば良いようだ。
上記の場合はvideoとaudio残して、字幕だけ削るので、
$ ffmpeg.exe -i input.mp4 -c:v copy -c:a copy output.mp4とか。
どのストリームを残すかはソース次第で。
このファイルは問題なく操作できた。
Delphiは外部DLL呼び出しの例外に対してセンシティブだというのは聞いたことがある気がするので、
それが関係しているかもしれない。