【DaVinci Resolve API】タイムライン上の選択クリップを取得する手法
まえがき
こんにちは、火注ゆかなです。
DaVinci Resolve のスクリプトを組んでる人の中にはタイムライン上の選択クリップに対する処理を実装したい方もいらっしゃることかと思います。
そして色々調べた結果、API にそんな機能は存在しないという事実に直面してガッカリするまでがワンセットじゃないでしょうか。
なんで実装しないんでしょうね?
私も実現方法なんてないだろうと思っていたのですが、先日 X(旧Twitter) の DM で「選択クリップの取得方法はないか?」という相談を頂きました。
最初は無理だと回答するつもりだったのですが、その過程で API ドキュメントを読み直しつつ色々弄ってたら 「これ、一手間かければ限定的にできないこともないな?」 と代替案を思いついたのです。
将来的に API に専用の機能が実装されたら不要になりますが、代替案としては現実的な範囲に収まっているはず。
というわけで、今回はタイムライン上の選択クリップ一覧を取得する手法について解説していきます。
タイムライン上の選択クリップの取得について
API に専用の機能はない
この記事を書いている2025/8/21現在ではタイムライン上の選択クリップを取得するメソッドは実装されていません。 残酷な事実です。
BMDフォーラムでも2018年頃から下記のようなやりとりが何度か繰り返されているようです。
A「タイムライン上の選択クリップの取得ってどうやるの?」
B「できない。そういう機能がない」
C「Timeline:GetCurrentVideoItem()があるぞ」
B「違う。それで取得できるのは選択クリップじゃない」
(現在の再生位置に存在する最上位トラックのクリップが返却される)
B「実装するよう開発に要望を出そう」
大体ここまでがワンセット。We Suck Lessフォーラムでも似たようなやりとり見たことあります。
いや本当に、何故ここまで遅れてるんでしょうね……。
ちなみにメディアプールの方だと以下のようなメソッドが追加されています
-
MediaPool:GetSelectedClips(): 選択中のメディアプールアイテム一覧を取得 -
MediaPool:SetSelectedClips(mediapoolItem): 指定したメディアプールアイテムを選択状態に加える
メディアプールの機能なのは残念ですが、これが実装されるなら、タイムライン上の選択クリップ取得機能が実装されるのもそう遠くはないのかもしれません。
とはいえ、いつ実装されるかわからない機能を待ってられないのも事実。
多少面倒でも、似たような機能を実現できるならすぐに使いたい人もいることでしょう。
たぶん。
代替案:選択クリップに判別用の情報を付与する
では本題に入りましょう。
代替案としては、選択状態を判別できるような情報を付与するというものです。
より具体的に言えば クリップカラーを選択状態の判別に利用します。
まず、タイムラインに配置されたクリップはクリップカラーを設定できます。
配置クリップを右クリック → クリップカラー → 設定したい色 を選択することで選択できます。


選択クリップのクリップカラー変更
クリップカラーはTimelineItem:GetClipColor()で取得できます。
未設定(デフォルトカラー)だと空の文字列が、色を設定していると色の名前を文字列で取得します。
下記のコマンドをコンソールで実行すると画像のようになります。
tl = resolve:GetProjectManager():GetCurrentProject():GetCurrentTimeline() -- 表示中タイムライン取得
items = tl:GetItemListInTrack("video", 1) -- ビデオトラックのトラック番号1番に配置されたクリップ取得
==items[1]:GetClipColor()


ビデオトラック1のText+クリップのクリップカラーを取得(未設定なら空の文字列)
クリップカラーを利用すると下記の手順で選択状態を疑似的に判別・処理できます。
- (ここだけ手動)選択クリップのクリップカラーをまとめて指定の色に変更
- タイムラインの字幕・映像・音声の全トラックに配置された全クリップ一覧を取得
- 取得したクリップ一覧を指定クリップカラーでフィルタリング
- フィルタリングされたクリップを処理
スクリプトの最後は選択クリップのクリップカラーを削除(未設定に戻す)するのが良さそうです。
選択クリップに対して他のスクリプトを続けて実行したいなら、クリップカラーの削除スクリプトは別途用意するのも良いでしょう。
例:選択クリップにのみマーカーを付与してみる
それでは実際に動かしてみましょう。
今回は簡単に、選択クリップ全てにマーカーを付与してみます。
Lua スクリプト
-- カレントタイムライン取得
project = resolve:GetProjectManager():GetCurrentProject()
tl = project:GetCurrentTimeline()
-- 全トラックに配置されたクリップを取得し、オレンジ色のクリップカラーなら選択したクリップとみなす
selected_color = "Orange"
selected_items = {}
track_type = {"video", "audio"} -- 字幕クリップ("subtitles")はクリップカラーを取得できないので除外
for _,k in ipairs(track_type) do
for i=1, tl:GetTrackCount(k) do
for _,item in ipairs(tl:GetItemListInTrack(k, i)) do
-- クリップカラーが一致するクリップのみ格納
if item:GetClipColor() == selected_color then
selected_items[#selected_items+1] = item
end
end
end
end
-- 抽出したクリップの先頭にマーカー追加
for _,item in ipairs(selected_items) do
item:AddMarker(1, "Green", "SelectedMarker", "マーカーメモ", 1)
item:ClearClipColor() -- 処理が終了したクリップのクリップカラーを未設定に戻しておく
end
Python スクリプト
# カレントタイムライン取得
project = resolve.GetProjectManager().GetCurrentProject()
tl = project.GetCurrentTimeline()
# 全トラックに配置されたクリップを取得し、オレンジ色のクリップカラーなら選択したクリップとみなす
selected_color = "Orange"
selected_items = []
track_type = ["video", "audio"] # 字幕クリップ("subtitles")はクリップカラーを取
for k in track_type :
for i in range(tl.GetTrackCount(k)) :
for item in tl.GetItemListInTrack(k, i+1) :
# クリップカラーが一致するクリップのみ格納
if item.GetClipColor() == selected_color :
selected_items.append(item)
# 抽出したクリップの先頭にマーカー追加
for item in selected_items :
item.AddMarker(1, "Green", "SelectedMarker", "マーカーメモ", 1)
item.ClearClipColor() # 処理が終了したクリップのクリップカラーを未設定に戻しておく
実行結果


選択したクリップの色を手動で一括変更(今回はOrange)

スクリプトを実行すると選択したクリップにのみマーカー付与ができた
クリップカラーを利用した場合の問題点
クリップカラーを一時的に変更することで選択クリップを判別・取得しましたが、いくつか問題点があります。
- 一部のエフェクトテンプレートと字幕クリップはクリップカラーを取得できない
- 普段からクリップカラーを変更する人には向かない
- クリップカラーを操作・利用するスクリプトと競合する可能性がある
①一部のエフェクトテンプレート、字幕はクリップカラーを取得できない
一部のエフェクトテンプレートはクリップカラーの設定・削除はできますが、取得しようとすると常に空の文字列を返却します。
クリップカラーを設定していても空の文字列しか取得できず、クリップカラーの判別ができないため、今回の手法では選択していても抽出対象外になってしまいます。
クリップカラーを取得できないテンプレートをいくつか確認したところ、おそらく Fusion Compositionを設定できない(Fusionページで開けない) ものが該当します。
スクロールやテキスト(テキスト+ではない方)、単色などなどですね。
該当テンプレートは右クリックしてもFusionページで開くなどのFusion関連のメニューが表示されません。

一部テンプレートは右クリックメニューにFusion関連のものがない

クリップカラーをOrangeに設定しているが、GetClipColor()を実行しても空の文字列しか取得できない
また、字幕トラックに配置される字幕クリップも同様です。
字幕クリップに関してはインスペクタ欄(画面右側)のファイルページからか、もしくは一緒に選択してるビデオトラック上の選択クリップを右クリックしてメニューを開かないとクリップカラーを設定できないのでちょっと面倒です。

字幕クリップもGetClipColor()でクリップカラーを取得できない
一部の選択クリップのみ処理がされていない場合、上記に該当するか確認した方が良いかもしれません。
一応、後述する代替案その2ならこの問題を回避できます。
②普段からクリップカラーを変更する人には向かない
そもそもクリップカラーの用途はクリップを分類・判別しやすくするためなので、普段からクリップカラーを設定している人には向きません。
まあ当然ですね。
③クリップカラーを操作・利用するスクリプトと競合する可能性がある
今回の手法と同じようにクリップカラーを処理対象の判別基準として利用するスクリプトとは競合する可能性があります。クリップカラーは同時に一種類しか設定できないからです。
また、クリップ分類のためにクリップカラーを自動設定するといったスクリプトとも相性が悪いです。
今回の手法も結果として選択クリップのクリップカラーを上書き・消去するわけですから、②で示したような分類のためのクリップカラー設定を邪魔しちゃうわけですね。
この辺も注意が必要です。
クリップカラーを変更したくない場合の代替案その2
選択したクリップの判別用にクリップカラーを利用した理由ですが、選択クリップの位置に関係なく、一度にまとめて同じ情報を簡単に付与できるからです。
同じ条件を一時的に満たせる機能としてはクリップの無効化があります。
無効化されたクリップは編集できますが、ビューアでは表示されなくなります。

クリップの有効・無効は右クリックメニューか、Dキーで切り替えられる

無効化されたビデオトラック1番のText+クリップが非表示になった
クリップの有効・無効はTimelineItem:GetClipEnabled()で取得できるので、選択したクリップを直前に無効にしておき、無効状態なら処理対象と見做すようにスクリプトを書き換えれば同じことができますね。
処理が終わったらTimelineItem:SetClipEnabled(true)で有効化できます。
クリップカラーと違ってDキーにショートカットが割り当てられている分、少しだけ楽かも。
しかし、これもまた普段からクリップの有効・無効を切り替える人には向かないし、クリップの有効・無効を操作・利用するスクリプトと競合する可能性があります。
(ただ、クリップカラーと違ってテキストテンプレートや字幕クリップなどでも有効・無効状態はちゃんと取得できます。)
結局のところ、どちらで実装するにしても同じような問題点は生じるので、実行環境に合わせてマシな方を選択するべきでしょう。
個人的にはクリップカラーの方が良いかなとは思います。
クリップカラーを変更しても映像に影響はありませんが、クリップの有効・無効の切り替えは映像に影響を及ぼすので。
ただ、Fusion Compositionを持たない一部エフェクトテンプレートや字幕クリップを活用する人ならクリップの有効・無効を利用する方が良いので、やっぱり一概にどちらが良いかは決められませんね。
おまけ:マーカーでは代用できない
マーカーも複数のクリップに一度に追加できます。
ただし、再生位置に存在しないクリップには追加できないのがネックになります。

マーカーはメニューバーからか、Mキーで追加できる

マーカーは再生位置に追加されるため、ビデオトラック2番のクリップには追加できていない
これでは同じトラック上の(横に並んだ)クリップに一度に判別情報を付与できません。
今回のように選択状態の判別情報を付与するのには不向きですね。
あとがき
タイムライン上の選択クリップ一覧を取得する手法についての解説は以上となります。
色々制限などはありますが、とりあえず API に専用機能が実装されるまでの繋ぎとしては及第点じゃないでしょうか。
こうして書くとスクリプト実行直前にクリップカラー変更する、あるいはクリップを無効化するだけの簡単なものなんですけどね。機能的にはやろうと思えば5年くらい前からできたのでしょうけれど……こういうのもコロンブスの卵というのでしょうか。
いや、今回相談していただけなかったらとてもじゃないけど思いつかなかったです。
勉強になりました。貴重な機会を頂きました。ありがとうございます。
それでは、今回の内容が皆さんのお役に立てば幸いです。
Discussion
だいぶ前にお見掛けしてから、クリップカラー変更を経由する方法を活用させていただいております。
有益な記事をありがとうございます。
アイデアの共有となりますが、クリップ数が多くなると、カラーが変更されたクリップを見つけるのに時間がかかることがあります。
それを解決するために二分探索が使えそうだと思いました。
ただし以下の条件があります。
選択中のクリップを操作したいという目的なら、達成しやすい条件だとは思います。
トラックから得られるクリップのリストはソート済みであるため、
という流れになります。
直接やりたいことに関して遠回り感は否めませんが、APIの追加は期待できなさそうなので、これが最善かなと思っています。
再生インジケーターの位置に応じて二分探索の開始となるインデックスを変更し、指数探索してもいいかもしれません。
なお、
GetCurrentVideoItem()が「一番上のクリップを無効化すると次のレイヤーを取得できる」ことを活かす戦略もあるかと思いましたが、書き込み操作は読み取りだけの探索より遅いのではというAIからの提案がありました。バージョン21.0.4にこんな記載が…?!
実際に使ってみました。
動作しているようです。嬉しい~✨
他、メディアプールのタイムラインエントリーからタイムラインオブジェクトの取得もサポートされてました。こっちも地味に助かります。
ようやくですね!
ちょっと使ってみましたが、返却される選択クリップの順番が少し気になりますね。再生タイミング順というわけではなく、配置順というわけでもなさそうで。
使う状況に応じて
item:GetStart()などでソートするなどの処理が必要になるかも。