ffmpegで動画、音声を切り取る

※動画、音声のどちらでも同じコマンドで良い。拡張子から自動判定される。

ffmpeg -ss 00:02:00 -t 00:03:30 -i (入力ファイル) (出力ファイル)

2分のところから3分30秒間の動画を切り取る(つまり、2分〜5分30秒の間を切り取る)
↑のコマンドだと、切り取る時間がやや不正確になる可能性がある。
正確に切り取りたいなら、

ffmpeg -i (入力ファイル) -ss 00:02:00 -t 00:03:30 (出力ファイル)

入力ファイルの後に時間を指定する。これだと動画全体を読み取ってから切り取るので、前述のコマンドより時間がかかる。

画像を別フォーマットに変換してサイズを減らす

最近はJPEG XL(JXL)、もしくはWebpのような新しい優秀なフォーマットがある。
JPEGPNGファイルを変換すればサイズを減らせるかも…?と思って試してみた。
変換ツールにはffmpegを使用。

ffmpeg -i input.png -distance 0.0 output.jxl

JXLでは-distance 0.0でロスレス圧縮指定。pngならサイズを小さくできたけど、元ファイルがjpgだと、減らないどころか逆に大きくなってしまった(細かく試してないので不明)

ffmpeg -i input.png -lossless 1 output.webp

webpの場合は-lossless 1でロスレス圧縮を指定。結果のファイルサイズはJXLより若干大きくなったが、誤差範囲かも。

ffmpeg -i input.jpg output.jxl

JXLはパラメータを指定しない場合、デフォルトでは非可逆圧縮になる。元がjpgだと、これでもサイズは小さくならなかった…

ffmpeg -i input.jpg output.webp

Webpも、デフォルトでは非可逆圧縮をする。これは結構小さくなった。非可逆圧縮ではWebpが優秀かも?

結論

ちなみに、webpは16-bit画像に対応していないという問題があるらしいです。
WebP Lossless はちゃんと Lossless してます #WebP - Qiita
という訳で、

  • そこまで画質を気にしない場合は、webpで非可逆圧縮
  • 可逆圧縮で劣化を避けたい場合や、16ビット以上の場合はJXL

がいいかもしれません。
(もっとパラメーターをいじれば違う結果が出るかも)

ffmpegで再エンコードして動画のサイズを減らす

万能?な動画・音声・画像変換ツールとして知られる、ffmpegコマンドの使い方について少し調べたので、とりあえず再エンコで動画のサイズを減らす方法について書いてみる。

H.265

H.265 - Wikipedia
持っている動画ファイルのコーデックがH.264、もしくはそれより古いコーデックを使っている場合、新しいコーデックに変換すれば、ファイルサイズを劇的に減らせるかもしれない。
※オプションの順番にも意味があるので、安易に入れ替えてはいけない。

画質にこだわりたい場合

ffmpeg -i (入力ファイル名) -c:v libx265 -c:a copy -crf 22 -preset superfast (出力ファイル名)

そこまで画質にこだわらない場合

ffmpeg -i (入力ファイル名) -c:v libx265 -c:a copy -crf 28 -preset superfast (出力ファイル名)

画質を犠牲にしてもサイズを小さくしたい場合

ffmpeg -i (入力ファイル名) -c:v libx265 -c:a copy -crf 33 -preset slow(出力ファイル名)

元の動画が古い場合は、H.264に変換するだけでサイズをかなり小さくできるかも

ffmpeg -i (入力ファイル名) -c:v libx264 -c:a copy -crf 18 -preset medium(出力ファイル名)

※動画フォーマットは拡張子から自動で判定される

  • -c:v libx265 : 動画コーデックを選択(libx265はH.265、libx264はH.264のコーデック)
  • -c:a copy : 音声は再エンコードしない(再エンコードしてもサイズは大して減らないので)
  • crf 〇〇 -preset 〇〇 のところで、パラメーターをいじって設定を変えられる。
  • -crf : 動画の質、クオリティを決める。デフォルトの数字は28(選択範囲は0~51。数字が小さいほうが質が高い)。劣化を気にしないならもっと数字を大きくしてもよい。もちろん、数字が小さいほどファイルサイズは増え、処理にも時間がかかる。

H.265の場合、crfの数字は、動画の質にこだわりたい場合でも、最高でも20くらいで十分。ほとんどの場合、20~35の間から選べば良い(多分)。
H.264の場合のデフォルトは23。18〜28が推奨されている(https://trac.ffmpeg.org/wiki/Encode/H.264#crf)

  • preset : 圧縮効率。ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow,の中から選ぶ。これは速度とファイルサイズのトレードオフを決めるオプションであって、動画自体の質にはほぼ影響しない。動画のクオリティは前述のcrfの数字で決定される。

ffmpegは非常に多機能なので、他にも色々と設定できるけど、マニア以外はこれだけ設定すれば良さそう)。

とりあえず一部だけ切り出して、試してみると良いと思う。

//動画の最初の一分だけ切り出して再エンコード
ffmpeg -ss 00:00:00 -t 00:01:00 -i input.mp4 -c:v libx265 -c:a copy -crf 28 -preset superfast (出力ファイル名)

HandBrake

HandBrake: Open Source Video Transcoder
GUIつきのHandBrakeというツールもある(内部でffmpegを使っている)。こっちを使ってもよい。
設定項目が色々あるが、基本的にはビルトインのプリセットを選ぶだけで良い。


参考:
Encode/H.265 – FFmpeg
ffmpegで動画をH.265エンコードして容量を大幅に節約する - 丁寧に手を抜く
FFmpeg - ArchWiki

gpgの共通鍵暗号でパスワードファイルを使う

gpgコマンドで、普通に

gpg -c --cipher-algo AES256 -o (出力ファイル名) (入力ファイル名)

みたいに入力すると、ダイアログが出てきて、対話的にそこにパスワードを入力することになる。

パスワードを手で入力するのではなく、パスワードファイルを使いたい場合は、少し長くなるけれど、

gpg -c --cipher-algo AES256 -o (出力ファイル名) --batch --pinentry-mode loopback --passphrase-file (パスワードファイル名) --pinentry-mode

このように、

  • --batch オプションを追加
  • --pinentry-mode loopback オプションを追加(これはmanには必要と書いてあるけど、無くてもいけるかも)
  • --passphrase-file オプションでパスワードファイルを指定

この3つを追加すれば良い。

ランダムなパスワードを生成

gpgコマンドで、ランダムなパスワードを生成することもできる。

gpg -a --gen-random 2 30

/dev/randomを直接使って乱数を出力しても良い。

head -c 30 /dev/random | base64

ファイルを共通鍵で暗号化する方法いろいろ

ファイルに自分でパスワードを設定して暗号化したい、という時はわりとあると思います。(たとえばクラウドストレージにファイルをアップロードするときなど…(参照↓)
グーグルドライブに同人誌や資料データをいれておいらたアカウントが凍結された話 - Togetter
定番ソフトが分からなかったので少し調べてみました。取り上げているのは、無料でオープンソースのソフトだけです。
共通鍵暗号のみ。弱いパスワードだと意味ないので、そこはちゃんとすること)

コマンドライン

Linux系限定ですが…(Macは持ってないので不明)

gpg

Linux系OSなら必ず入っているはず。

gpg -c -o (出力ファイル名) --cipher-algo AES256 (ファイル名)

-c(--symmetric)が共通鍵暗号で暗号化するオプション。-oオプションで暗号化後のファイル名を指定、--cipher-algoオプションで暗号化アルゴリズムを指定することができます(おそらくAES256が一番強いアルゴリズム)。
コマンドを入力するとパスワードの入力画面が表示されるので、そこに入力すればOKです。
復号化は、

gpg -d -o (出力ファイル名) (ファイル名)

-dオプションを使います。
パイプでつなぐことも可能。

curl -L https://example.com/example.jpg | gpg -c --cipher-algo AES256 -o encrypted.gpg
# -aはascii文字列に変換して出力させるオプション
# 出力を標準出力にするときは-o -
gpg -c -a -o - file | less

ディレクトリの場合はtarでまとめてから暗号化すれば良いかと(gpgtarというそれ専用のコマンドもあるので、そちらを使っても良い)。
(ちなみに、gpgはデフォルトだとパスワードをキャッシュするので、再起動等をせずにすぐに復号しようとすると、パスワード入力不要で復号できてしまいます。この挙動が嫌な場合は、--no-symkey-cacheオプションをつけてキャッシュ無効化すること)

openssl

これもLinux系OSなら入っているはず。

openssl enc -e -aes-256-cbc -pbkdf2 -in (ファイル名) -out (出力ファイル名)

コマンドを入力すると、"enter AES-256-CBC encryption password:"と聞かれるので、そこでパスワードを入力すればOK。
(aes-256-cbcの、cbcというのは暗号利用モード(暗号利用モード - Wikipedia)の一つで、安全とされている。他にECBも選択できるが、これは弱いモードなので使わないこと)
(pbkdf2はパスワードをハッシュ化する方式の一つ(PBKDF2 - Wikipedia)。これを使わないとopenssl から警告されてしまう)
復号化は、

openssl enc -d -aes-256-cbc -pbkdf2 -in (ファイル名) -out (出力ファイル名)

GUIあり

Picocrypt

GitHub - HACKERALERT/Picocrypt: A very small, very simple, yet very secure encryption tool.
ややマイナーなツールですが紹介してみます。
PicorcyptはGo言語で開発されたソフトで、WindowsMacLinuxのすべてで使えます。軽量さを売りにしているようです。
GUIは非常にシンプルですが、使い方は難しくないはず。
ダウンロードはこのページから
https://github.com/HACKERALERT/Picocrypt/releases

7zip

ファイル単体の暗号化とは少し違いますが、7zは暗号化にAES256を用いているので、暗号化の強度もおそらく十分なはずです。クロスプラットフォームなのでWindowsMacLinuxのすべてで使えます。パスワードを設定して、普通に7zファイルを作成するだけでOK。
動画や画像ファイルの場合は圧縮する意味があまりない(jpegpng、mp4などは既に圧縮された形式なので、再度圧縮しても容量はあまり減らない)ので、無圧縮にするのが良いかと思います。
暗号化7zに対応したアプリを使えば、スマホ上でも解凍可能です。

Cryptomator

Cryptomator - Free Cloud Encryption for Dropbox & Co
これはクラウドストレージ向けに特化したソフトで、デスクトップ(WindowsMacLinux)だけでなくAndroidiOS版もあるようです。私は使ったことがないですが()、DropBoxGoogle Driveで使うならおそらく利便性は高いのではないかと。
ダウンロードは
https://cryptomator.org/downloads/

VeraCrypt

VeraCrypt - Free Open source disk encryption with strong security for the Paranoid
WindowsMacLinuxで使用可能な、定番の暗号化ツール。様々な工夫が施されているようで、セキュリティについてはおそらく最高峰だと思われます。
まず入れ物として暗号化コンテナファイルを作成して、その中にファイルを入れていく(入れたファイルは自動で暗号化される)、みたいな使い方が基本。
大きな特徴はOn-The-Fly Encryption (Transparent Encryption, 透過的暗号化)という仕組みで、コンテナ内での操作はすべて自動的に暗号化/復号化されます。たとえば、コンテナ内の動画ファイルを直接アプリで再生できます(再生時に自動で復号化してくれる)。これの何が良いのかというと、復号化したファイルを一旦保存する必要がなく、そのためディスクに痕跡を残さないという点です。(参考→https://veracrypt.fr/en/Introduction.html)


コンテナファイルは通常のファイルど同様に、コピーしたり移動したりすることが可能。もちろんクラウドストレージにアップロードすることもできます(スマホに対応していないのはネックですが)。
ダウンロードは
https://veracrypt.fr/en/Downloads.html

Webサイト

hat.sh

Hat.sh - Simple, fast, secure client-side file encryption
ブラウザ上でファイルを暗号化してくれるサイト。Next.jsで実装されているみたい。
ソースコードはここ↓)
https://github.com/sh-dv/hat.sh
暗号化はローカルのブラウザで実行され、ファイルはサイト側に送信はされないので大丈夫です(もし心配なら、暗号化するときはPC(スマホ)の通信を切っておいても良い)

以上に述べた方法で、(ちゃんと複雑なパスワードを設定すれば)この世界の誰にも解読はできないはず…

一応、続き?っぽい記事です↓
bogamp.hatenablog.com
bogamp.hatenablog.com

Torを使って簡単にonionサイトを公開する方法

匿名ネットワークとして有名なTor。実は、これを使ってサイトを公開するのも簡単なのですが、意外と日本語の情報が無い気がするので書いてみます。

OnionShare

docs.onionshare.org
ここに全部書いてあるので、あまり書くことはないのですが…
OnionShareはファイル共有ソフトと説明されることが多いと思いますが、静的サイトを公開することもできます(静的なので、PHP等は使えない。GitHub PagesやNetlifyと同じだと思っておけばいいはず)。使ったことはないですが、Torを使ったチャットも簡単にできるみたいです。

OnionShareでウェブサイトを公開する

OnionShareを起動したら、
「Connect to Tor」ボタンを押す
https://docs.onionshare.org/2.6/ja/_images/autoconnect-welcome-screen.png


「Host a Website」を選択
https://docs.onionshare.org/2.6/ja/features.html#host-a-website


https://docs.onionshare.org/2.6/ja/_images/website.png
ここに公開したいファイルをドラッグ&ドロップすればOK。(HTML、CSSJavaScriptファイル等を置けば、静的ページを公開できる。htmlファイルを置かずに、共有したいファイルを置いた場合、Apacheのデフォルトみたいにディレクトリのリストが公開される。どちらでも良い)

https://docs.onionshare.org/2.6/ja/_images/website-files.png

ここで、「This is a public OnionShare service(disable private key)」にチェックを入れない場合、自動的にパスワードでページがロックされる。公開したいならここにチェックを入れればよい。

OnionShareは非常に便利で、しかも簡単に使えるのですが、不思議とTor Browserに比べて認知度が低い気がします。なぜだろう…

netcatでファイル転送してみる

あんまり実用性はない気がするが、netcatコマンドを使ってファイルを転送してみた。
Linuxが前提だけど、WindowsならWSL、AndroidならTermux使えば同じようにできるはず。
(即席でファイル転送するなら、python3 -m http.serverでhttpサーバー立てるほうが簡単だと思う。勿論ちゃんとやるならftpとかscpとか使うべき)
・転送側

cat file1 |  nc -l 8000

・受け取り側

nc (ipアドレス) 8000 > file1

転送終了しても何のメッセージも出ないので、終わったタイミングで切るしかない。

※tarでまとめて送る場合
・転送側

tar cvf - * | nc -l 8000

・受け取り側

nc (ipアドレス) 8000 | tar xvf -

※さらにgzipで圧縮してから送る場合
・転送側

tar czvf - * | nc -l 8000

・受け取り側

nc (ipアドレス) 8000 | tar xzvf -

gpgで暗号化を噛ませるのもやってみたけど、パイプで繋ぐとなぜかうまくいかなかった。標準入力渡すタイミングの問題かな?(いったんファイルとしてダウンロードしてから復号するなら問題なかった)