はじめに
この記事はTouchDesigner Advent Calender 2018の22日目の記事です。
TwitterのApp申請が厳しくなった昨今では需要のあまりないことは承知の上で、僕はこんな感じでTouchDesignerで作った作品をTwitterにアップロードしているよ、という共有記事です。
シェア
以下のrepoにあるtoxファイル(Todays_TD.tox
)を作って使っています。
これまで
僕は今年の夏頃にTouchDesignerに出会ってそこから5ヶ月弱で130作品ほどシコシコ作品を作ってTwitterやらInstagramにアップロードして承認欲求を満たしてまいりました。TouchDesignerで作品を作るのはとても奥深く面白い勉強だったのですが、一つとても煩雑な作業がありました。それが「作品投稿」の過程です。最初の頃は以下の手順で行なっておりました。
- Movie File Out TOPで動画を撮る
- ffmpegを使ってmov->gifに変換する
- Twitterだとgifは15MBのファイルサイズ制限があるので超えていないかチェック
- 超えていれば①からやり直し
- ツイート
「どうしてわざわざgifで?」というのはTwitterに動画をあげる際はファイルサイズに気を使わないとサーバの都合で非常に荒い動画となってアップロードされてしまうからです。せっかくいろんな人に見てもらえるかもしれないのに、満足いかないクオリティで出すのは嫌ですよね。 とはいえ、真面目にこの工程でやろうとするとだいたい5分くらいかかります。メンドーですねー。
そんな最中、TouchDesingerのExperimental版でgif出力に対応する、ということがわかりました。
Experimental Build 2018.41570 now available for download!
— TouchDesigner (@1null1) November 14, 2018
Unicode
Physics
USD and FBX
Custom OPs
Line Material
NDI Audio
ZED Camera
Stop-frame movies and .gifs
UV unwrapping renders
GPUdirect Blackmagic
Multi-NIC support
So much more…https://t.co/1Nw1f7Ipp5#TouchDesigner
「これはいいきっかけだし、Twitterに作品投稿を楽にできるようなシステムを組んでみるか」というのがTodays_TD.tox
を作った所以です。
なにをやったか
以下の手順で簡単に自分の作品をTwitterに投稿できます。
- [REC] gif動画を撮影することができます
- [LOAD] 撮影した動画を読み込んで流すことができます
- [CHECK] ファイルサイズが15MBを超えていないか確認することができます
- [TWEET] 撮影したgif動画を添付して「今日の #TouchDesigner 」ツイートできます
一つずつ見て行きましょう。
1. [REC]
recボタンは単純でbuttonの1,0がMovie File Out TOPのrecord
をON-OFFしています。
なんでもいいんですがtest.gif
という名前で保存しておきます。
2. [LOAD]
先ほどrecした動画をLOADします。 RECの0,1を使ってLOADしようとするとTouchDesingerはクラッシュして落ちます。 (ファイルの録画&保存と同時に読み込むことは難しいようです。) 本当はこのbuttonは作りたくなったですね。
3. [CHECK]
# -*- coding:utf-8 -*- def onValueChange(channel, sampleIndex, val, prev): import os bytes = os.path.getsize("test.gif") if bytes < 0: raise Exception('Cant Get Gif file!!') m_bytes = round(bytes / 1000000, 2) print (m_bytes, "MB") if m_bytes < 15: op('size').text = str(m_bytes) + "MB OK!!" else: op('size').text = str(m_bytes) + "MB NG!!"
buttonの0,1で先ほど作ったtest.gif
のファイルサイズを確認します。pythonでファイルサイズを一番簡単に調べるのはos.path.getsize
です。
視覚的に捉えられるようにこの結果をtest TOPにしてさきほどLOADしたTOPにoverします。
ボタンポチポチで簡単にここまでチェックできます。やったね。
4. [TWEET]
# -*- coding:utf-8 -*- def onValueChange(channel, sampleIndex, val, prev): import json from requests_oauthlib import OAuth1Session Consumerkey = op('../params')[0,1].val Consumersecret = op('../params')[1,1].val AccessToken = op('../params')[3,1].val AccessTokenSecret = op('../params')[4,1].val twitter = OAuth1Session( Consumerkey, Consumersecret, AccessToken, AccessTokenSecret, ) url_text = "https://api.twitter.com/1.1/statuses/update.json" url_media = "https://upload.twitter.com/1.1/media/upload.json" files = {"media" : open("test.gif", 'rb')} req_media = twitter.post(url_media, files = files) if req_media.status_code != 200: print("MEDIA UPLOAD FAILED... %s", req_media.text) exit() print("MEDIA UPLOAD UPDATED!!") media_id = json.loads(req_media.text)['media_id'] print("MEDIA ID: %d" % media_id) tweet = "今日の #TouchDesigner" params = {"status" : tweet, "media_ids" : [media_id]} req_media = twitter.post(url_text, params = params) if req_media.status_code != 200: print("TWEET FAILED... %s", req_text.text) exit() print("TWEET SUCCEED!!")
さて、最後はツイートするスクリプトです。
都合よく何年か前に僕が書いた記事がそのまま使えそうだったので過去の自分に感謝して拝借。
ここまでファイルサイズに問題がなければ15秒くらいでできます。
ちなみに説明していませんでしたが、Customize Component...
の設定は以下のようになっています。
ComponentのExtensionに関しては以下の記事を参考にしてください。
ちなみにTipsというか忘れがちなところとしてbutton COMPの順番を制御するのはこの部分です。
AlignはTop to Bottom
にしています。
さて今回はここまで。
さいごに
会社のAdvent CalenderのほうにもTouchDesingerに関する記事をあげています、よろしければこちらもご覧ください。
(追記 2019.10.12)
TouchDesignerがExport Movie Dialogからgifアニ出力できることにふと気づいた、この記事はmovie file out topでやってるけどdialogの方も見たらあった
— Kousei Ikeda (@ikekou) October 9, 2019
まだTwitterに作品投稿するのに消耗してるの? ~ TouchDesinger編 ~ - DOT NOTES https://t.co/8rAcN4xMIa