動画編集での素材管理、プロジェクトのフォルダ構造について
前置き
趣味で創作物を定期的につくったりする。 画像、動画編集などなど。
とくに動画編集にあたっては素材が多い、かつプロジェクトファイルと素材が別々になる。整理とかでフォルダを移動したりすると一気にプロジェクトがグチャグチャになる。 そこで今更だけどどのように動画編集においてファイル、素材管理をすればいいか考えた。業務というよりはあくまでも個人レベルでの話だけど。
結論
結論としては
- 素材はプロジェクトフォルダ毎に毎回入れて管理
- プロジェクトフォルダには
20xx-xx-xx projectname ├ project(プロジェクト用) ├ export(書き出し用) ├ video(素材) ├ audio(素材) ├ Image(素材) └ document(構想などのメモ)
のようにサブフォルダを作成して管理するのが1番よさそうかなと思った
詳細
1.について
毎回同じような素材(BGM,動画素材)を使う場合、共通の素材フォルダを作成してそこから素材をインポートする方法を考えた。 だけどこの方法だと
- プロジェクトフォルダ毎に移動できない(素材へのパスが変わってしまう)
- 素材フォルダを何かしら変更したときの各プロジェクトへの影響が大きすぎる
という問題点が大きかったため、やっぱり各プロジェクトフォルダ毎に毎回素材を投入して管理することにした。 このやり方だと単純にプロジェクトフォルダ名を変えたり、移動しても問題なし。シンプル。
ただし同じ素材が増えていく可能性が増えるのでファイルサイズ、ファイル数的によろしくない。 同じ素材ばっかりを使う&その素材のサイズがめちゃ大きい場合は、同じプロジェクトフォルダに別名で新たなプロジェクトを作るのも手かもしれない。同じような素材を使う≒内容も似ているため、大枠で同じプロジェクトフォルダでも問題ないという考え方で。
2.について
1つのプロジェクトフォルダには、以下のようなサブフォルダを作成して管理する。
20xx-xx-xx projectname ├ project(プロジェクト用) ├ export(書き出し用) ├ video(素材) ├ audio(素材) ├ Image(素材) └ document(構想などのメモ)
- project
編集ソフトのプロジェクトファイルを置く所。なんだかんだバージョン2…3…とかバックアップとかテスト版で複数になりやすいので専用にサブフォルダがあると良いと思った。 あと①で述べたように違う(似ているけど)プロジェクトだけど、同じ素材を使う、前編、後編みたいな場合はここに作ると良さそう。
- export
書き出した完成ファイルを置く所。これもなんだかんだテスト版やエンコード設定変えた版、バージョンアップで複数になっていくことが多いので分ける
- video
動画の素材ファイルを置く所。プロジェクトによっては更にeffectフォルダ(BB素材、エフェクト素材)などあっても良いかもしれない。
- audio
音声の素材ファイルを置く所。プロジェクトによっては更にmusic(BGM用),se(効果音),voice(実況やコメント付きだとその収録音声)フォルダに分けてもいいかも。
- image
画像の素材ファイルを置く所。これも拡張子でわけたり、psd専用のフォルダなどプロジェクトによって加えていくのもあり。
- document 動画の構想、計画メモ、注意点、学んだこと、仕様などを置く場所。
補足
ファイル名自体は日時を入れるのが無難そう。ただ動画は"MOV214~"など収録したままのファイル名で置いとくのもあり。
参考
日本語で動画編集 フォルダ 管理
とぐぐっても抽象的な記事ばっかりであまり良いのがなかった。
唯一よかったのがこちらの方のフォルダ構造の動画
また英語で"使ってるソフト名" folder structure
とかで調べると具体的な説明動画が出てきてくれる。
動画はPremium proについてだけど、無料のAviutlでも全然参考になる。
まとめ
動画編集のファイル管理、フォルダ構造についてあらためて考えてみた。 結論としては
- 共通ではなくプロジェクトフォルダごとに素材格納、管理
- 各プロジェクトには、素材、書き出し、プロジェクト用のサブフォルダを入れて管理
もの凄い当たり前で今更なことを仰々しく書いた記事になったけど、なんだかんだ自分は今までこれをやらずにぐじゃぐじゃだったので意識したい。 また動画編集だけじゃなくて、他の画像編集、ゲーム作成などファイル、フォルダ管理にも使えそう。
動画編集に最適な動画形式を考える(mp4,aviとか)
概要
昔から趣味でちょいちょい動画編集をしている。
そのときに毎回気になるのが動画形式。
経験がある人ならわかると思うけど、ファイルの圧縮率と編集不可は反比例する。
mp4(h.264)は画質、サイズで最強だけど編集には負荷が大きい。
かと言って負荷がほぼない無圧縮や可逆圧縮だとファイルがバカでかくなる。(元ファイルより数十倍とかになる)
なんだかんだ適当に選んだavi(divx)とかが画質微妙だけどサイズ、編集負荷的に無難だと感じて変換してたりもしてた。
最近またゲームを身内で配信、録画したりして知識を共有したりして楽しんでいる。そのときにまた編集に最適な形式を改めて意識したので、なにが最適か考察してみた。
その前に予備知識として
動画形式(フォーマット)とコーディックの違いについて。
簡単に言うと
・動画形式(フォーマット):ものを収納する部屋、倉庫の形式、仕様
例:avi,mpg,mp4,webmなど
・コーディック:そこに収納する方式(アルゴリズム)
例:h.265,mpeg-4,VP9など
ややこしい点として
①フォーマットとコーディックの名前が似ているもの、同じものがある
mpg(フォーマット)とmpeg-1,mpeg-2(コーディック)
とか
だいたい名前が似ている場合、そのフォーマットとコーディックはセットで使われる。
簡単にいうと「和室」という収納場所(フォーマット)と、「和室(に適した収納法)」(コーディック)があるみたいな感じ。
②どのフォーマットとコーディックの組み合わせでもOKなわけではない
例えばavi(フォーマット)でh.264(コーディック)を使うことは基本できなかったりする…
簡単にいうと「和室」という収納場所(フォーマット)には、「洋室(に適した収納法)」(コーディック)は使えない感じ…
…だったけど、最近でたFFmpegという鬼エンコーダによって、割といろんなフォーマットとコーディックの組み合わせができるようになった。
本題
では動画編集に関しては、どのフォーマット、コーディックで編集するのが一番か。
下の記事に各フォーマット、コーディックにおける画質、編集(再生負荷)、動画サイズが比較されている。素晴らしい。
考察
これをみてフォーマットに関してはなるべく多くの編集環境に対応したavi,mp4あたりが無難かなと思った。
そしてコーディックに関しては自分の環境にあったのものを選択すれば良さそう。
・例えばPCが鬼スペックで全然負荷をものともしないのであれば、h.264やvp9でガンガン圧縮した動画を編集。動画サイズを節約できる。鬼スペックじゃなくても簡単な編集で済む場合はこれでもありかも。
・スペックが微妙でもストレージの容量が沢山あれば、RAW…じゃなくてもUt Video やLagarithをコーディックとして仕様。数十分の動画で200も300GBも容量くうけど再生負荷は非常に優しい。短時間でもフレーム単位でエフェクトやシーンが変わったり、沢山動画が挿入されるといった複雑な編集をしたい場合はこれを選ぶ。
・そして普通のスペック、普通のストレージの場合、意外とdivxやwmv9のコーディックがありだとわかった。容量も再生負荷もそこまでくわずわない。デメリットとしては画質がやっぱり劣化する。逆にいえば画質を多少犠牲にしていいのであれば、この選択肢もあり。ただ結構レトロなコーディックなのでフォーマットとして対応できともコーディック的に弾かれる編集ソフトはあるかもしれない。
結論(の1つ)
・簡単な編集とかだとそのままh.264でおk
・編集が複雑になったり、ストレージの容量がたっぷりならLagarithなどの可逆圧縮コーディック
・h.264編集だと負荷が大きい…けど容量も余裕がない…画質は多少犠牲にしてもいい…→DivX, wmv9という選択もありかも?
余談:ゲーム配信、録画の場合
ゲーム画面を録画→編集をしたい場合、最近の環境だとOBSstudioが強い。OBSstudioが配信ソフトとして最強なのに加えて録画のエンコーダ設定でデフォでFFmpegが使えるからだ。なのでaviやmp4のフォーマットを選びつつ、いろんなコーディックを選択し、編集ソフトに最適な形で録画できる。
ただ残念なのがコーディックにDivXやXvidがないのが悲しい。h.264だと再生負荷が微妙に高いし、かといって可逆圧縮だと録画時間がながくなるゲーム実況ではPCが破裂する。なのでwmv9が無難なのか…と。obs stuidoのffmpeg設定でwmvコーディックというまさかの化石コーディックを使うかもしれない、と結論に至った
最短経路問題(ワーシャルフロイド法)をpythonで実装してみる
概要:ワーシャルフロイド法の実装メモ
最短距離問題(ある点からある点への最短距離を探す)において、 全ノードを調べる場合に便利なワーシャルフロイド法。 pythonで実装したので、そのメモ
warshall_floyd法
特徴
- 計算量が(O(頂点数3))
- 実装がシンプル
主な手順
- 各頂点間の最短距離を行列で表す(隣接行列)
- 自分自身(頂点2→頂点2)は0
- わからない場合はinf
- 頂点i→頂点jにおいて、頂点kを経由した場合の最短距離を求める 頂点i→頂点j = min(頂点i→頂点j ,頂点i→頂点k, 頂点k→頂点j)
参考
pythonでの実装例
# warshall_floyd法 def warshall_floyd(d): for k in range(n): for i in range(n): for j in range(n): d[i][j]= min(d[i][j],d[i][k]+d[k][j]) return d # n:頂点数 m:辺の数 n,m = map(int,input().split()) # 隣接行列の定義、初期化 # ①コスト(存在しないときはinf) d = [[float("inf") for i in range(n)] for i in range(n)] # ②自分自身へのコストは0 for i in range(n): d[i][i] = 0 # コスト入力(何もないときは1,問題によっては入力時に指定される) cost = 1 for i in range(m): a,b = map(int,input().split()) d[a][b] = cost d[b][a] = cost # output print(warshall_floyd(d))
python。特定のビットの桁を判定、0や1にする方法
B: 価格の合計 - AtCoder Beginner Contest 014 | AtCoder
をといたので復習に。
本当にメモ書きレベルなので誤字脱字多めです。
▲bit計算でフラブ管理が楽
・bitでフラグ管理が便利
・計算はそのまま&,|でおk
・数字はそのまま10進数か0b---
・注意:binとかformatはあくまで最終表示(str)
・pythonだとformat(i,'b').zfill(n)で0bないし、桁数合わせられて便利(あくまで表示は)
・n桁目のフラグたってる?
if target & (1<<n-1):
例
if 10 & (1<<2) :
# 10は1010,(1<<2)は100
# 1010 と100の積は0000
#=右から3番めは0を判定している
・n桁目のフラグをon
target | (1<<n-1)
例
10 | (1<<2)
# 10は1010,(1<<2)は100
# 1010 と100の和は1110
# = 右から3番めを1にした
・n桁目のフラグをoff
target & ~(1<<n-1)
例
10 & ~(1<<3)
# 10は1010,(1<<3)は1000
# ~(1<<3)は0111
# 1010 と0111の積は0010
# = 右から4番めを0にした
参考までに
pythonでファイル読み込み→リストとして処理する方法
目的
- pythonで簡単なデータを読み込む
- 読み込んだデータを表示だけでなく、処理もしたい
- 読みんだデータをリストに格納した
こんなデータを読み込んで、処理したい sample.txt
5 12 56 84 45 65 66 65
読み込んだデータをそのまま表示するやり方は他の記事でも沢山あった。けどリストとかに入れて処理していきたい。atcoderだとinput()
だけど、たまに他のテストだと用意されたデータを読み込んで処理するケースがあった。そのとき躓かないように、メモ。
方法
まとめて読み込んでリストへ格納
#テキスト読み込み f = open(r"ファイルのパスとかデータ","r",encoding="utf-8") #それぞれの行をまとめて取得する lines = f.readlines()#各行がリストへ格納 f.close()
ぶっちゃけこれだけでOK。linesにデータがリストとして格納されている。うえのsample.txtだとlinesには
[' 5\n', ' 12 56 84\n', ' 45 65 66 65']
が入っている。
まとめて読み込んで格納+改行削除
改行を消したい場合は
#テキスト読み込み f = open(r"ファイルのパスとかデータ","r",encoding="utf-8") #それぞれの行をまとめて取得する lines = f.readlines()#各行がリストへ格納 #改行を除く場合 for i,v in enumerate(lines): lines[i] = v.replace("\n", "") #それぞれの行をまとめて取得する lines = f.readlines()#各行がリストへ格納 f.close()
#lines [' 5', ' 12 56 84', ' 45 65 66 65']
リストとして落とし込めたので、あとは煮るなり焼くなり好きにできる。
すっきり版
改行削除くらいなら内容表記ですっきりできる
#テキスト読み込み f = open(r"ファイルのパスとかデータ","r",encoding="utf-8") #それぞれの行をまとめて取得する lines = f.readlines()#各行がリストへ格納 lines = [v.replace("\n", "") for v in lines] f.close()
さらに色々処理もできる
sample.txtやatcoderの問題のように各行がさらにスペースで区切られたデータの場合、
for i,v in enumerate(lines): lines[i] = v.replace("\n", "") lines[i]= list(map(int,(lines[i].split())))
のようにsplitでわけてintに変換→リスト化で
#lines [[5], [12, 56, 84], [45, 65, 66, 65]]
にように綺麗にできる。(いらないかもだけど)
一行ずつの場合 (確認専用?)
f = open(r"ファイルのパスとかデータ",encoding="utf-8") for line in f: line = line.replace("\n", "")#改行を消す場合 #何か処理 f.close()
一行ずつ処理する場合は上のようになる。ただその都度の処理になるので、データを後から処理したい場合、一旦なにかに格納し直す必要がある。.append(line)
みたいに。表示だけの確認用ならいいけど、処理を考えたらやっぱりまとめて読み込んで格納したほうがいいかも
特定の行だけ読み込む (n行目指定)
一方で特定の行だけ処理をしたい場合は、一行ずつ読み込む方法も有用。膨大なデータでn行目だけ取り出したい!というときはenumerate
でindexをとりだし、if文で判定すればよい。
f = open(r"ファイルのパスとかデータ",encoding="utf-8") n = 1 line = [v.replace("\n", "") for i,v in enumerate(f) if i==n] f.close()
#line #1行目をとりだす(0行スタート) [' 12 56 84']
特定の行だけ読み込む (文字列判定)
他にも特定の文字列が含んでいる行だけ取り出す場合とかも便利。また内包表記を使えば、取り出した行が複数個あっても追加してくれるので便利。
f = open(r"ファイルのパスとかデータ",encoding="utf-8") target = '6' lines = [i.replace("\n", "") for i in f if target in i] f.close()
#lines 6が含まれる列だけ取り出す [' 12 56 84', ' 45 65 66 65']
jsonの場合
入力データ
#sample.json { "name": "亀仙人", "age":354 }
を読み込む場合
import json f = open(r"ファイルのパスとかデータ",encoding="utf-8") data = json.load(f) f.close()
#sample.json {'name': '亀仙人', 'age': 354}
まとめ
- とりあえず全部読んで処理したい→
.readlines()
で各行をリストへ格納 - 特定の行だけ絞って処理したい→
i in f
で、iに対して条件文 - 内包表記を使うとリストの定義もappendも必要なくて便利
リポジトリフォルダ(.git)より上位層のフォルダ名を変更したい場合、注意すべきこと
結論
ない
概要
今回の疑問
リポジトリ(.git)のあるフォルダ 例えば「project」とすると
cookie/..略../project/aaa/ から cake/..略../project/aaa/ としたい場合
- .gitはproject以下しか監視していないので、単純にcookieのフォルダ名をcakeにするだけでよい
- git側で設定することは何もない
- なので.gitより上階層だったらフォルダの場所を変更しても問題は全くない
整理でフォルダ名を変更するとき、対象フォルダの中にリポジトリがいくつか入っているけど、これ名前とか場所変更していいのかな?と思って調べてもなかなか該当記事が出てこないので書いた。(当たり前のこと過ぎてないのかもしれないけど…)
補足:.git以下は必要あり
まずgitのルート以下のフォルダ、ファイル名を変更したい場合
git mv [変更したファイル(フォルダ名)] [変更後のフォルダ(フォルダ名)]
gitが監視しているのでgit mv(またはaddなど)で調整する必要がある
例 projectフォルダに.gitがある場合 /project/aaa/ を /project/bbb/ としたい場合
git mv aaa bbb
でおk
これは調べてたらよく出てくるやつ
Pythonで各桁の和を、数値処理だけで行う方法
よくある対象の各桁の処理を行うアルゴリズム。 はじめに通常の文字列処理(楽)を行う方法を紹介し、そのあとそれをしない方法を考える。
まずは普通に文字列を使う場合
例1: 各桁の和
数値→文字列化→map1つを数値としてリスト化して合計を求める。
n = 1234 result = sum(list(map(int, str(n)))) #10
例2: その数値に特定の数字が含まれているか検索
数値→文字列化→文字列を検索
#対象に3が含まえれているとき、反応(なべあつ問題? n = 1234 if "3" in str(n): print("3!") #3!
本題:あえて文字列処理を一切行わない場合
例1: 各桁の和
10で割った余りを順番にみていく
「10で割った余りを加算→対象を10で割って切り捨て」
を対象が0になるまで繰り返し
def keta_sum(n): sum = 0 while n>0: sum += n%10 #対象の桁を加算 n = n//10 # 次の桁をみる return(sum) n = 1234 print(keta_sum(n))
例2: その数値に特定の数字が含まれているか検索
10で割った余りを順番にみていく
「10で割った余りをみる→対象を10で割って切り捨て」
を対象が0になるまで繰り返し
#対象に3が含まえれているとき、反応 def hoge(n): while n>0: if n%10 == 3: return("3!") #対象の桁が3だったらreturn n = n//10 # 次の桁をみる n = 1234 print (hoge(n))
おわり
文字列処理したくない~ってとき、10進法じゃなくてn進法で判定したい~ってときには使えるかも?