LoginSignup
4
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-11
変更
  • 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

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3