見出し画像

【音MADを作ろう#2】外部ファイルを参照して出力を行うプログラム【Davinci Resolveで動画編集】

Lua言語を使っていろいろ遊んでいたら、気が付いてしまいました、
外部ファイルを参照する方法を。

今回は、外部にテキストファイルがあると仮定して、これを動画内に読み込んでテキスト形式で表示するプログラムを共有します。
それだけです、今回は短めですがご了承ください。
※動画編集ソフト「Davinci Resolve」の使用が前提です

前回は、Davinci Resolveで動画編集をする際、プログラミングを扱おうと思ったら避けては通れないツールである「エクスプレッション」の意義とその使い方を説明しました。今回は、こちらの使用が前提となりますので、まだご覧になっていない方はこちらを最初にご覧ください。↓


1,外部のファイルを読み込む意義

さて、外部のファイルを読み込む方法について解説する前に、なぜそうする必要があるのかについて説明しましょう。

前回説明した「エクスプレッション」ですが、プログラミングを扱えて便利な反面、実は重大な欠点があるのです。
それは、文字数に制限があるということ。

普通に扱う分にはこの文字数制限に引っかかることは(まず)ないのですが、場合によっては多くの情報・コードを詰め込まなければならないことがあります。この際、この文字数制限が非常に大きな問題としてのしかかるのです。

また、同じようなデータベースに複数回にわたってアクセスする必要がある場合や、多くのファイルを機械的に処理する必要がある場合もあります。このような場合も、ファイルを機械的に読み込んで自動処理することに大きな意義があります。今回は、このようなケースを想定します。
(例:多数の駅がある路線の架空車内ディスプレイ動画を作成する場合)

2,【基本】外部のファイルを読み込む

外部のテキストファイルを読み込んで、テキストやテロップの形式として動画内に出力する方法を考えます。

まずは、元となるテキストファイルを作成し、保存しましょう。

サンプルのテキスト(sample_document_1.txt)

注意点が1つあります。
ファイル名やディレクトリ名に一部でも日本語を入れないでください。
(※ファイル名・ディレクトリ名に日本語を含むと読み込めません)

今回は、上記のテキストファイルを、
C:\Users\(ユーザー名)\Documents\sample_document_1.txt
として保存しました。

次に、このテキストファイルを読み込んで、テキストとして表示するためのLuaソースコードを「エクスプレッション」内に記述します。その内容は以下の通り。

:local filepath = "C:\\Users\\(ユーザー名)\\Documents\\sample_document_1.txt";
local file = io.open(filepath, "r");
local content = file:read("*a");
file:close();
return content;

一行目でfilepathを指定し、io.openでファイルを読み込みます。その内容をcontentに格納してファイルを閉じた後、出力します。まさに基本構成。

※ファイルのパスを記述する際、エスケープを2回置くことに注意。

コピー&ペースト

きちんとファイル内のテキストが出力されていることが分かります。
これを応用すればテロップとしても用いることができますね。

テロップ配置の自動化については後日、改めて記事にする予定です。

3,【応用】複数のファイルを一斉に読み込む

次に、複数のファイルを読み込んでいきます。
とは言っても、基本は変わりません。
例として、以下のような内容を含むsample_document_2.txtを作成し、保存してみました。

2つ目のテキストファイル

こちらも
C:\Users\(ユーザー名)\Documents\sample_document_2.txt
とします。
これで、先ほどのファイルと合わせて2つのテキストファイルが存在することになります。これらを一斉に読み込むLuaソースコードは以下の通り。

:local base_path = "C:\\Users\\(ユーザー名)\\Documents\\sample_document_";
local num_files = 2;
local files_content = {};
local function read_files();
   for i = 1, num_files do;
           local filepath = base_path .. i .. ".txt";
           local file = io.open(filepath, "r");
           local content = file:read("*a");
           file:close();
           table.insert(files_content, content);
   end;
end;
read_files();
for i, content in ipairs(files_content) do;
    if i==1 then;
    result = files_content[i];
    else;
    result = files_content[i-1] .. files_content[i];
    end;
end;
return result;

複数のファイルに共通する部分をbase_fileという形でまとめています。
num_filesはファイルの数。今回は2ですね。
関数"read_files()"内は基本的には先と同一。
table.insertで、読み取った要素を配列(files_content)内に挿入しています。
後半部では、ipairs()関数を用いて配列files_content内で反復処理を行い、resultに代入して出力しています。

コピー&ペースト

そして、同様にこれを「エクスプレッション」に入れると、2つのファイルの内容が無事出力されました!

今後は、ここでの内容をより深く掘り下げていければと考えています。
特に、変数time(注:前回の記事を参照)を組み合わせることでさらに面白いことができそうです。

4,おしまい

いかがだったでしょうか。
今回は短めですが、「外部ファイルを参照する」というのは、何かと有用な技法ではないかと思います。皆さんも是非ご活用ください。

この記事が気に入ったら、「好き」やフォローなどをしていただくと、今後の記事制作の励みになりますので、よろしくお願いします。

今後もこのように、プログラミングを用いた動画編集についてを中心に、マインクラフトやJRの規則など幅広く取り扱っていく所存です。

ご意見・ご感想などありましたら、コメントしていただけると幸いです。
また、(動画編集など)お仕事がございましたら、ご連絡いただけると幸甚に存じます。
そろそろ就活の時期かぁ(鬱)

この記事が気に入ったらサポートをしてみませんか?