3
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Plots.jlで動画出力するにはffmpegまたはimagemagickが必要

変更
  • 20180518 題材をライフゲーム(未完)から波形に変えました。
  • 20180521 シンタックスハイライトを追加

問題

  • Jupyter notebook上Juliaで波形を書いた。
  • Plots.jlとGR.jlをつかって描画し、gif動画に出力しようとした。

using Plots
gr()

x = linspace(0, 2π,50)

anim = @animate for i in x[2:end]
    plot(x, [sin.(x - i),cos.(x-i)],seriestype=:scatter)
end

gif(anim,"/tmp/三角関数.gif",fps=15)

以上のコードを実行したところ、以下のようなエラーが出ました。

could not spawn `ffmpeg -v 0 -i 'C:\Users\(ユーザー名)\AppData\Local\Temp\jl_5421.tmp/%06d.png' -vf palettegen=stats_mode=diff -y 'C:\Users\(ユーザー名)\AppData\Local\Temp\jl_5421.tmp/palette.bmp'`: no such file or directory (ENOENT)

ffmpegの導入

どうやら動画作成にはffmpegというのが必要らしい。そこで
1. ffmpegのページからffmpeg-4.0.tar.bz2をダウンロードして解凍した。
2. 解凍されたフォルダの名前をffmpegに変えてC:\Program Files内に移動させた。
3. システム環境変数のPathを編集、値C:\Program Files\ffmpeg\binを新規追加した。

ffmpeg追加後、もう一度同じコードを実行したところ以下のようなエラーが出ました。

failed process: Process(`ffmpeg -v 0 -framerate 2 -loop 0 -i 'C:\Users\(ユーザー名)\AppData\Local\Temp\jl_B822.tmp/%06d.png' -i 'C:\Users\(ユーザー名)\AppData\Local\Temp\jl_B822.tmp/palette.bmp' -lavfi paletteuse=dither=sierra2_4a -y '\tmp\三角関数.gif'`, ProcessExited(1)) [1]

パッケージのアップデート

このエラーメッセージを調べたところ似たようなところではまってる方がいらっしゃいました。
https://github.com/JuliaPlots/Plots.jl/issues/1239

この方曰くPlots.jl/animation.jlのpngエンコーダのバグがこのエラーの原因らしいということです。ありがたいことにこの方は修正案を提出し、提出案はマージされています。ということは、最新バージョンのPlots.jlにアップデートすればいいのではないかと考えました。 

julia>Pkg.update()
(前略)
INFO: Upgrading BinDeps: v0.8.7 => v0.8.8
(中略)
INFO: Upgrading GR: v0.26.0 => v0.31.0
(中略)
INFO: Upgrading IJulia: v1.7.0 => v1.8.0
(中略)
INFO: Upgrading Plots: v0.15.0 => v0.17.0
(後略)

でも、やっぱり同じエラーが出ました。
failed process: Process(`ffmpeg -v 0 -framerate 2 -loop 0 -i 'C:\Users\(ユーザー名)\AppData\Local\Temp\jl_CF8A.tmp/%06d.png' -i 'C:\Users\(ユーザー名)\AppData\Local\Temp\jl_CF8A.tmp/palette.bmp' -lavfi paletteuse=dither=sierra2_4a -y '\tmp\三角関数.gif'`, ProcessExited(1)) [1]

出力先の修正

作業しているnotebookの保存先にtmpフォルダを新規作成し、出力ディレクトリを"/tmp/三角関数.gif"から"tmp/三角関数.gif"に変えたらうまくいきました。

using Plots
gr()

x = linspace(0,2π,50)

anim = @animate for i in x[2:end]
    plot(x,[sin.(x-i),cos.(x-i)],seriestype=:scatter)
end

gif(anim, "tmp/三角関数.gif", fps = 15) #"/tmp/三角関数.gif"->"tmp/三角関数.gif"

三角関数.gif

振り返ると、failed processエラーは、出力ディレクトリ名を正しく書いていなかったことが原因で、Plots.jlのバグは関係なかったのかもしれません。
もしそうならば、ffmpegをインストールしてPathを通した段階で首尾よくGIF動画出力できるのかもしれません。

この問題を書こうと思ったのは、最近同じ問題を別の方法で解消されていた方を見かけたからです。


Pkg.add("ImageMagick")
Pkg.build("ImageMagick")
して
using ImageMagick
を書き加えれば動画出力できるみたいです。

参考文献

http://docs.juliaplots.org/latest/animations/
https://qiita.com/Urad/items/f489a5aa826ecb2087d1

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What are the problem?