Giter VIP home page Giter VIP logo

aviutl_browser's Introduction

aviutl_browser

AviUtl の拡張編集プラグイン上でブラウザーの表示内容を持ち込めるようにするためのプログラムです。
使用には bridge.dll ( https://github.com/oov/aviutl_bridge ) の導入が必要です。

注意事項

aviutl_browser は無保証で提供されます。
aviutl_browser を使用したこと及び使用しなかったことによるいかなる損害について、開発者は一切の責任を負いません。

これに同意できない場合、あなたは aviutl_browser を使用することができません。

ダウンロード

https://github.com/oov/aviutl_browser/releases

インストール方法

exedit.auf と同じ場所にある script フォルダー内に、browser フォルダーを入れればインストール完了です。
bridge.dll も必要になるので忘れずにインストールしておいてください。

拡張編集上で追加されたカスタムオブジェクトを選ぶと browser\exe\aviutl_browser.exe が起動されます。
このプログラムがウィルス対策ソフトなどでブロックされないようにしてください。

表示用コンテンツの作り方

やることの大筋は以下の2ステップです。

作例として 絵文字 / Markdown も付属しているので参考にしてください。

1. カスタムオブジェクト用のスクリプトを作成する

カスタムオブジェクト用のスクリプトである *.objbrowser フォルダー内に作成します。
このスクリプトからブラウザーを呼び出すことになります。
(最終的にスクリプトが実行できればいいので、呼び出し元はアニメーション効果などでも構いません)

-- ブラウザーの表示内容を受け取るために透明の画像を用意する
obj.setoption("drawtarget", "tempbuffer", 1920, 1080)
obj.load("tempbuffer")

-- フォルダー指定の場合
local ok, ret = require("browser").execute({
  dir = "mycontent", -- contents フォルダー内のフォルダー名を指定する
  tabid = "", -- 同じコンテンツをブラウザーの別タブで開く場合は識別用の文字列を指定する、必要なければ省略可
  param = "文字列をJavaScriptに渡せます", -- 必要なければ省略可
  userfile = file, -- ファイル参照ダイアログを使う場合
  dev = false, -- 開発モードを有効にする場合は true
});

-- abc ファイル指定の場合
local ok, ret = require("browser").execute({
  abc = "mycontent.abc", -- contents フォルダー内のファイル名を指定する
  tabid = "", -- 同じコンテンツをブラウザーの別タブで開く場合は識別用の文字列を指定する、必要なければ省略可
  param = "文字列をJavaScriptに渡せます", -- 必要なければ省略可
  userfile = file, -- ファイル参照ダイアログを使う場合
  dev = false, -- 開発モードを有効にする場合は true
});

-- 戻り値:
-- ok - 成功した場合は true, 失敗した場合は false
-- ret - 成功した場合は HTML から resolve で渡した文字列

開発モードを有効にすると DevTools ウィンドウが表示されます。
このウィンドウで F5 を押すと HTML のリロードができるため、製作中に AviUtl を再起動しなくても HTML などの変更を反映させられます。

tabid は同じコンテンツをブラウザー上で別のタブとして複数保持したい場合に使用できます。
例えば同じカスタムオブジェクトをレイヤー1とレイヤー2に置いて同時に表示する場合、tabid が同じだと毎フレーム レイヤー1を描画レイヤー2を描画 と交互に呼び出され続けることになるため、描画するたびに表示内容が変わっていることになり効率が悪くなる可能性があります。
それぞれに別々の tabid を割り当てておけば片方のタブはレイヤー1の描画だけ、もう片方のタブはレイヤー2の描画だけを処理すれば良くなります。
ただし当然別タブに読み込む分のオーバーヘッドがあるので、可能な限り HTML 側で交互に呼び出されてもパフォーマンスが落ちないように準備しておくのが望ましいです。

2. ブラウザーで表示するコンテンツを browser\contents フォルダー内に作成する

コンテンツのデータ準備方法には、フォルダーを指定する方法と、abc ファイルを指定する方法の2つがあります。
付属コンテンツでは abc ファイルを指定する方法が使われています。

abc ファイルの実態は「表示用データを詰め込んだ zip ファイルを作成し、拡張子を変更しただけ」のファイルです。
コンテンツの利用者がファイルの中身を気にしなくてもいい場合は abc ファイルを使うとファイルが散らばりません。
逆に、適宜 HTML などに手を入れながら使うような使われ方を想定する場合はフォルダー指定のほうが適しています。

ブラウザーが起動されると、フォルダーや abc ファイルのルートにある index.html が読み込まれます。
JavaScript で AviUtlBrowser.registerRenderer(render) などとして関数を登録しておくと、render 関数が毎回の描画時に呼び出されるようになります。
これを利用して、トラックバーのデータなどを毎フレーム HTML 内に反映させることでアニメーションなどを行えます。

<!DOCTYPE html>
<meta charset="utf-8">
<p>Hello world <span></span>!</p>
<script>
  // 描画されるたびに呼び出される非同期関数を登録する
  // params.param には前のステップの Lua スクリプト内で渡した「文字列をJavaScriptに渡せます」が入っている
  AviUtlBrowser.registerRenderer(async params => {
    // param の内容を画面に反映
    document.querySelector("span").textContent = params.param;
    return ''; // もし Lua 側に返したいデータがあるなら文字列で渡す
  });
</script>

コンテンツ制作時の注意事項

  • 画面左上の1ピクセルは使用できません
    • 内部で画面更新を検知するために、左上の1ピクセルを使用しています
      画像などを左上ピッタリから表示してしまうと左上の1ピクセルが欠けてしまうので、必要に応じて回避してください
  • html タグや body タグへの CSS 適用に注意
    • 更新検知用のドットが描画される位置がずれてしまうと、正しく更新を検知できずに AviUtl がフリーズする可能性があります
    • marginpadding などを確保したい場合は div などを作ってそこに当ててください
  • オンライン上のデータへアクセスするスクリプトは十分に注意して作成すること
    • 毎フレームアクセスするようなことをすると相手に多大な迷惑がかかるので絶対にやらないでください
    • 例えば「岡崎市立**図書館事件」では1秒に1回のアクセスで逮捕されています
  • abc ファイルを作るときはフォルダーごと圧縮しないこと
    • zip ファイルのルートにはフォルダーではなく index.html が来るようにしてください
  • ファイル参照ボタンも使えます

FAQ

Q. AviUtl がフリーズする、動かない

サンプルとして付属しているコンテンツが動かない場合はブラウザーがブロックされずに正しく動作しているか確認してください。
自作したコンテンツが動かない場合は「コンテンツ制作時の注意事項」の内容を確認してみてください。

例えば JavaScript で resolve() を呼び忘れると、ブラウザ側に完了したことが伝えられないのでいつまでも待ち状態になります。
途中で例外が投げられる場合などにも注意してください。

Q. DevTools が閉じられない

開発モードが有効なときに開く DevTools は、設計上ウィンドウを直接閉じることはできません。
(閉じられるようにしてもいいけど1フレーム動かしたらまた出てくるだけなので……)

Q. 自作の abc ファイルだと index.html が読み込めない

ファイルの直下にはフォルダーではなく index.html が来るようにしてください。

ビルドについて

リリース用ファイルは GitHub Actions で自動生成しています。
ビルド方法や必要になるパッケージなどは GitHub Actions の設定ファイル を参照してください。

Credits

aviutl_browser is made possible by the following open source softwares.

Chromium Embedded Framework

https://bitbucket.org/chromiumembedded/cef

Copyright (c) 2008-2020 Marshall A. Greenblatt. Portions Copyright (c) 2006-2009 Google Inc. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  • Neither the name of Google Inc. nor the name Chromium Embedded Framework nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

See also LICENSES.chromium.html for Chromium open source credit list.

PicoJSON

https://github.com/kazuho/picojson

Copyright 2009-2010 Cybozu Labs, Inc. Copyright 2011-2014 Kazuho Oku All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

aviutl_browser's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

aviutl_browser's Issues

一部のヘッダーはデフォルトで吐くようにする

Chrome 92 以降では SharedArrayBuffer に制限が掛かるはずなので、一部のヘッダーをデフォルトで出力することによってその問題を回避できるようにする。

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

`external_begin_frame_enabled` を使えるようにする

現在は 60fps でのレンダリングに依存しており、どんなに効率よくプログラムやスクリプトが作られていても1秒間に30個程度のカスタムオブジェクトしか処理できないと思われる。
external_begin_frame_enabled を使うと 60fps 以上の速度で処理できるようになるはずなので、対応できるようにしたい。

実装の際には普段は 1fps 程度で動かしておき、処理を行っている最中だけ全速力で回すような処理にしたい。
(あくまで非表示タブの軽量化などのための機能なので、完全に止めることはできないと思われる)

https://www.magpcss.org/ceforum/viewtopic.php?f=6&t=17985

Note also that this functionality does not have test coverage, so bugs in this area would not be a great surprise.

壊れているかもしれないことには留意する。

コンテンツを読み込むタブを指定できるようにする

同じコンテンツを別のレイヤーに配置して同時に使う場合に、パフォーマンス面などで問題が発生する。
それを回避するために、同じコンテンツでも状況に応じて別のタブとして保持できるようにする必要がある。

以下が実装案。

  1. obj.layer を基準にして勝手に管理する
  • コンテンツ制作者側でも利用者側でも基本的には気にせず使えるようになる
  • オブジェクトを掴んで下にドラッグすると大量のタブが生成されるのが回避できない
  • 同じレイヤー番号に次々と別のコンテンツを配置すると、切り替わるたびに再読み込みが走る
  • シーンとルートでも区別がないのでレイヤーが被る可能性がある
  1. execute を呼ぶときに tabid を指定させるようにする
  • コンテンツごとに柔軟に管理できる代わりに、製作者も利用者も概念をある程度把握する必要がある
  • タブIDを次々に変更すると大量のタブが生成されるのが回避できない

今の段階では 2 のほうが無難な実装に見える。

2 の実装でも tabidobj.layer を入れれば 1 とほとんど同じメリット/デメリットが享受できるので、選択する余地があるという意味でも 2 が良さそうに見える。
唯一の違いは 1 だとタブ数の上限が 100 になるけど 2 だとコンテンツごとに別管理になるからそれ以上になる。
ただ、そもそも普通の運用ではそんなに作ることはないから多分気にする必要はあんまりない。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.