メッセージ

2022年02月12日の記事

2022/02/12(土)春M(SpringM)で「0による浮動小数点数除算」

2022/02/12 25:22 PC(全般)
春M(SpringM)で特定のファイルに対して以下の操作をした時に、「0による浮動小数点数除算」とダイアログが出ることがある。
[対象操作]
・ファイル削除
・コンテキストメニュー呼び出し

一度ダイアログが出てしまうと、プロセスがファイルハンドルを掴みっぱなしになってしまうようで、
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呼び出しの例外に対してセンシティブだというのは聞いたことがある気がするので、
それが関係しているかもしれない。
OK キャンセル 確認 その他