ffprobe(ffmpeg)でmkvファイルの一部のパラメータを抜き出したいとき
こちらの記事で(特に書いていないけど)mp4を念頭に置いた記事を書いた。
が、mkvではうまくいかなかった。
その場合は以下のようにオプションを変更する。
```
```
それはさておき最近姿勢が悪く体調に影響が出ている模様。
良い椅子を買うべきか…
Amazon Linux 2023にはopenssl 1.1.1tはインストールできない
#tl;dr Amazon Linux 2023にてopensslのソースビルドを試したところ「対応してない」ということでビルドすらできなかった。
This system (linux-x86_64) is not supported. See file INSTALL for details.
epel-releaseが利用可能なら多分導入できる(Amazon Linux 2023はepelが使えない)
そもそも今更1.1.1使う?っていう話
世の中悲しいかな未だに古いphp(5系、7系、8.までが1系1)やらpython3.7とか使っていたりすると3系が使えなかったりする。 そもそも1.1.1は未だにメンテナンスされていて2,3、まだ現役といえば現役。
Amazon Linux 2では1.0系だったため、初期で導入されているpythonは3.7だった。 また、phpもopenssl>=0.98で大体のものが動いていたのでそれまでは問題なかった。
もし、AWS上でシステムが更新できない場合はAmazon Linux 2023は使わずAmazon Linux 2で動かすのが良さそう。 OSは2025年5月まで4はサポートしてもらえる。
- PHP: 要件 - Manual↩
- といっても2023/04/06現在、あと半年は切っているので今から新しく始めるのであれば3系を入れない理由はあんまりない↩
- https://www.openssl.org/policies/releasestrat.html↩
- https://aws.amazon.com/jp/amazon-linux-2/faqs/↩
ffprobe(ffmpeg)で一部のパラメータを抜き出したいとき
TL;DR
ffprobe -v error -select_streams v -show_entries stream=bit_rate -of csv=p=0 input_file
ほしい部分をstream=bit_rate
のように指定する。
pythonでは結果に改行コードが含まれるときと含まれないときがあったので、その処理をしてあげるとエラーが減る。
(詳細未確認)
やりたいこと
ffmpegなどで動画のエンコードなどをしたいときに、もとのファイルの横サイズだけがほしい時がある。
特にpythonなどで一括処理したいときには非常に重宝するが、ffprobe
をそのまま利用するとプログラムから利用するには難しい。
ffprobe input.mp4 ffprobe version 2022-12-29-git-d39b34123d-full_build-www.gyan.dev Copyright (c) 2007-2022 the FFmpeg developers built with gcc 12.1.0 (Rev2, Built by MSYS2 project) configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libvpl --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint libavutil 57. 43.100 / 57. 43.100 libavcodec 59. 55.103 / 59. 55.103 libavformat 59. 34.102 / 59. 34.102 libavdevice 59. 8.101 / 59. 8.101 libavfilter 8. 53.100 / 8. 53.100 libswscale 6. 8.112 / 6. 8.112 libswresample 4. 9.100 / 4. 9.100 libpostproc 56. 7.100 / 56. 7.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mp4': Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 creation_time : 2022-08-30T00:00:0.0000000Z encoder : Blackmagic Design DaVinci Resolve Duration: 00:15:06.62, start: 0.000000, bitrate: 7293 kb/s Stream #0:0[0x1](und): Video: hevc (Main) (hvc1 / 0x31637668), yuv420p(tv, bt709/bt709/unknown, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 6968 kb/s, 29.97 fps, 29.97 tbr, 30k tbn (default) Metadata: creation_time : 2022-08-30T00:00:00.000000Z handler_name : VideoHandler vendor_id : [0][0][0][0] timecode : 01:00:00;00 Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 320 kb/s (default) Metadata: creation_time : 2022-08-30T00:00:00.000000Z handler_name : SoundHandler vendor_id : [0][0][0][0] Stream #0:2[0x3](eng): Data: none (tmcd / 0x64636D74) Metadata: creation_time : 2022-08-30T00:00:00.000000Z handler_name : TimeCodeHandler timecode : 01:00:00;00 Unsupported codec with id 0 for input stream 2
ビデオストリームの情報だけにする
ffprobe.exe -v error -select_streams v -show_entries stream input.mp4
でビデオの情報だけを抜き出せる
ffprobe.exe -v error -select_streams v -show_entries stream input.mp4 [STREAM] index=0 codec_name=hevc codec_long_name=H.265 / HEVC (High Efficiency Video Coding) profile=Main codec_type=video codec_tag_string=hvc1 codec_tag=0x31637668 width=1920 height=1080 coded_width=1920 coded_height=1080 closed_captions=0 film_grain=0 has_b_frames=2 sample_aspect_ratio=1:1 display_aspect_ratio=16:9 pix_fmt=yuv420p level=153 color_range=tv color_space=bt709 color_transfer=unknown color_primaries=bt709 chroma_location=left field_order=progressive refs=1 id=0x1 r_frame_rate=30000/1001 avg_frame_rate=30000/1001 time_base=1/30000 start_pts=0 start_time=0.000000 duration_ts=27197170 duration=906.572333 bit_rate=6000000 max_bit_rate=N/A bits_per_raw_sample=N/A nb_frames=27170 nb_read_frames=N/A nb_read_packets=N/A extradata_size=106 DISPOSITION:default=1 DISPOSITION:dub=0 DISPOSITION:original=0 DISPOSITION:comment=0 DISPOSITION:lyrics=0 DISPOSITION:karaoke=0 DISPOSITION:forced=0 DISPOSITION:hearing_impaired=0 DISPOSITION:visual_impaired=0 DISPOSITION:clean_effects=0 DISPOSITION:attached_pic=0 DISPOSITION:timed_thumbnails=0 DISPOSITION:captions=0 DISPOSITION:descriptions=0 DISPOSITION:metadata=0 DISPOSITION:dependent=0 DISPOSITION:still_image=0 TAG:creation_time=2022-08-30T00:00:00.000000Z TAG:language=und TAG:handler_name=VideoHandler TAG:vendor_id=[0][0][0][0] TAG:timecode=01:00:00;00 [/STREAM]
stream情報の一部を抜き出す
上だけでも十分見やすくなったが、この中の一部だけを抜き出したい。 例えばビットレートを抜き出すのであれば、
ffprobe.exe -v error -select_streams v -show_entries stream=bit_rate input.mp4 [STREAM] bit_rate=600000 [/STREAM]
となる。
当然bit_rate
のように-show_entries stream
で表示される表記でないといけない。bitrate
とやっても何も出てこないので注意。
プログラムで参照しやすくする
上記の抜き出しでも情報は得られるが、プログラムから呼び出す際はサブプロセスのresultを取得する際は最低限の情報にしたいので、以下のようにオプションを増やす。
ffprobe.exe -v error -select_streams v -show_entries stream=bit_rate -of csv=p=0 input.mp4 600000
これで使いやすくなった。
プログラムでの利用として注意したいのは、時折出力結果に改行コードが含まれることである(Python利用時に発見、その多々詳細不明)。 再現性はあるけどもよくわかっていないので、利用時には出力結果を直接intなどに変換するのではなく改行コードを取り除いてから変換すると良い。
varnishのresolves to too many addressesを解決する
TLDR
- libvmod-dynamicを追加でインストールする
- ホワイトリスト設定を忘れない
varnishの仕様
varnishでは基本的にバックエンドとの対応付けは1対1が基本であり、複数IPなどには対応することができない。
(注:ドメインなどを記載した場合はコンパイル(起動)時にDNSを引いた際のIPアドレスを利用しているっぽい)
つまりbackendに"s3-ap-northeast-1.amazonaws.com"のような複数のAレコードを持つようなものを指定しようとすると、resolves to too many addresses
と怒られる1。
varnishのドキュメントやggってみるとgoto
というライブラリが出てくるが、これはシェアウェアのバンドルなので利用できない。
調べてみるとgotoとは別にlibvmod-dynamicというモジュールがあったのでこちらを利用する。 libvmod-dynamicはバックエンドに接続する際にDNSを引くという動作をする。つまりDNSレコードが変わるような環境でも利用できる。 また、複数のレコードがある場合にも問題なく利用できる。
環境
varnish: 6.0.10(yumからインストール)
構成としてはALBでSSL終端しVarnishが受けて各種バックエンドやS3などに振り分けるといったもの(画像書くのが面倒だった)。 varnishはリバースプロキシとして利用しており読み替えでs3を呼び出す。 s3は静的ファイルが主においてありcssなどを要求する際に利用される。
s3のDNSのAレコードは8つあり、しかもおよそ5秒ごとに変更されるためTTLを長めにしてしまうとアクセスできなくなるので注意(2022/10/28現在)。
構築
- 必要なライブラリを追加する
sudo yum install getdns-devel varnish-libs-devel
- リポジトリにアクセスし、varnishのバージョンと同じブランチを選択する。今回は6.0。
- CodeをクリックしDownload ZIPのリンクをコピー
- wget する。今回は
wget https://github.com/nigoroll/libvmod-dynamic/archive/refs/heads/6.0.zip
- unzip
unzip 6.0.zip
- ディレクトリに入りmake&install
./autogen.sh ./confugure make
- 問題なく
make
できたらsudo make install
- 完了を確認したらvclの設定へ
varnish vmod-dynamicの使い方
基本的にはsrc/vmod_dynamic.vcc
に書いてあるのでそれを見て設定する。
今回は以下のように設定した。
s3.vcl
import dynamic; probe www_probe { .window = 5; .initial = 7; .threshold = 3; .interval = 5s; } acl www_acl { "0.0.0.0/0"; } sub vcl_init { new s3 = dynamic.director( port = "80", probe = www_probe, whitelist = www_acl, ttl = 1s); }
default.vcl
set req.backend_hint = s3.backend("s3-ap-northeast-1.amazonaws.com");
ここで重要なのは、whitelist
の設定である。
vmod_dynamic.vcc
には「ACLに一致する名前解決結果のみが使用される」と記載があるので、これを記載しないと動作しないようである。
今回はAWSがAWSIPからランダムに(実際はラウンドロビンか何か)IPを変更しているため設定値を0.0.0.0/0
としている2が、利用IPの範囲が決まっていれば192.168.0.0/31
のように範囲指定すべきである。
設定例では"192.168"/24;
となっているのだがこの場合は"192.168.0.0/24"となるんだろうか…?この書き方なら/16
が適切な気がするんだけども。
また、TTLは基本的にはDNSの設定値と同様か少し小さい値を設定しておけば良い。
今回はAWSの設定に振り回されないように1sec
にしてあるが、普通は5m
でも1h
でもいいと思う。
反映
sudo systemctl restart varnish
で反映させる
再起動してもいいかも。
気になること
- ドキュメント記載の
"192.168"/24;
を設定したときの許可範囲 - www_probeの各パラメータの適切さがそもそもわかっていない
- varnishのドキュメントとlibvmod-dynamicのドキュメントではinitialの定義が違うんだけどlibvmod-dynamicが間違ってる?
varnishわからないことだらけなので誰か教えて下さい。。。
今からやるWindows10への無料アップデート
Windows7のサポート終了である2020年1月14日が近づいていますね.
ですが,様々な理由からWindows7のままという方も多いのではないでしょうか.
Windows10では(というか8から)UIが大幅に変更されたこともあって,私は無料アップグレードを躊躇してしまいました.
そうはいってもサポートが切れたWindowsを使用し続けることほど危険なことはありませんし,古いものにしがみついてるのも良くないのでアップグレードしましょう.
詳細は以下のリンクで確認してください.
早速やろう,と言う前に.
Windows7からWindows10に移行するにあたって一つ注意することがあります.
Windows10では「デジタルライセンス」によってハードウェア構成と認証情報が紐づく方式となりました.
(現在はMicrosoftアカウントと紐付いているはず)
OS更新の機会にハードの更新も行うと良いかもしれません.
(特にメモリ4GB以下なら8GB[お金があるなら最低16GB!!!!]以上にHDDなら256GB以上のSSDに換装すると幸せになるかも)
じゃあやる
準備するもの
・PCのバックアップ
・ネットワーク環境
やり方
※アップデート時にデータが消える恐れがありますので,必要であればバックアップしてください.
データが消えたなどの責任は取りかねます.
1. Windows7/8.1PCから以下のURLにアクセス
2. 「ツールをダウンロード」から'MediaCreationTool.exe'をダウンロードし,実行.
3. 「実行する動作の選択」で「今すぐこのPCをアップデート」を選択する.
あとは全部アップデータがやってくれます.
これだけなんでやってみてくださいね.というかタダでできて,WindowsUpdateもやってくれるんだからやっておねがいだからみんなやって.
失敗談
だいぶ短いので私がちょっと変わった環境で似たようなことをやろうとして失敗したことを書いていきます.
これやろうとしてもうまくいきませんのであしからず.
失敗したやつ
・MacBook Pro (15-inch, 2018)
・Windows7 Upgrade用ディスク
・BootCamp環境
試したこと
1. とりあえず普通にBootCamp環境へWindows7をインストール
3. Windows10のインストーラをDLしUSBメモリを作成
4. BootCamp環境のWindows7から作成したUSBメモリでUpdateを試す
結果的にできませんでした.
USBメモリを検証するところで弾かれた記憶.
ちゃんと確認はとっていませんが,どうもAppleが提供しているBootCamp用のドライバが読み込まれる前にUSBメモリにからのアップデートを試してるのかな?
USBメモリの作成やらディスク分割なんかを何度も試したけど,時間がかかって結局失敗する悪い例.
USBを勉強する(1.1~1.2)
いろいろあってUSBを学びたいと思います. とりあえず,下の本を参考に.
USB 3.0設計のすべて: 規格書解説から物理層のしくみ,基板・FPGA・ソフトウェア設計,コンプライアンス・テストまで (インターフェース・デザイン・シリーズ)
- 作者: 野崎原生,畑山仁,永尾裕樹
- 出版社/メーカー: CQ出版
- 発売日: 2011/10/11
- メディア: 単行本
- クリック: 1回
- この商品を含むブログ (1件) を見る
忘れっぽいので,少しずつまとめていこうと思います.
USB規格の特徴
- 汎用的
- 簡単
- 低コスト
- 接続後にすぐ実行(プラグ・アンド・プレイ機能:PnP)
- 電源を入れたまま接続可能(ホット・プラグ機能)
- デバイスに電源を共有できる
USB1.0
- 1.5MbpsのLow Speed(LS)モードと12MbpsのFull Speed(FS)モードをサポート
USB2.0
- 480MbpsのHigh Speed(HS)モードをサポート
USB3.0
USB3.0の策定にはデータサイズや補助記憶装置の容量が大きくなったのが主な理由のようだ.
USB2.0の仕様書はUniversal Serial Bus Specification, Revision 2.0だが, USB3.0の仕様書はUniversal Serial Bus 3.0 Specification, Revision 1.0 とのこと.
結局完全上位互換ならRevision3.0でも良かったのでは?
USB2.0と3.0で共通のアーキテクチャ
USB通信モデル
基本単位としてエンドポイント,パイプ,トランスファで成り立つ.
エンドポイント
エンドポイント番号,転送方向,転送タイプからなる
- エンドポイント番号: 開発者によって1~15の値が割り振られる
- エンドポイント番号0はデフォルトエンドポイント(後述)で予約済み
- 転送方向
- INエンドポイント: エンドポイントからファンクション・ドライバへの読み込み
- OUTエンドポイント: ファンクションドライバ・からエンドポイントへデータを書き込み
- 双方向エンドポイント: どちらも可能.通常はデフォルト・エンドポイントのみ
- 転送タイプ
- コントロール・エンドポイント: (基本的に)デフォルト・エンドポイント専用
- バルク・エンドポイント: 大量のデータをエラーなく伝送する
- インタラプト・エンドポイント: 一定時間内に少量の転送をエラーなく行う
- アイソクロナス・エンドポイント: 一定時間内に必ずアクセスされ大量のデータ転送が可能だが,エラーの可能性がある.リアルタイム伝送などを想定
基本的なUSBメモリはコントロール・エンドポイントとバルク・エンドポイントなのかな? いろんな機能を入れようとするとそれ単体ではなさそう.
インタラプトはキーボードとかで使いそう.
とりあえずここまで.
Prime Student(Amazon Student)の資格を更新する
概要
・Prime Student(旧Amazon Student)の資格期限は4年
・学生である証明をして再審査してもらえばいい
小話
前回の記事から早一年.
結局,”週に一本”どころか”年に一本”になっている.
今年は何本になることやら.
そもそも論文書かないと卒業できませんので,それが終わったら頑張っていきたい.
(そんなこと言ってるから年一になる…)
本題
Prime Student(旧Amazon Student)はとても便利なもので,買い物・動画・音楽・AWS等とにかく使い勝手が良いわけですが,この度私は資格を失いかけました.
別に学生じゃなくなったとか,そういうわけではなく,Prime Studentに”登録してから4年経った”だけなんです.
規約にから抜粋
お客様がPrime Student 会員登録をキャンセル又はAmazon.co.jp のアカウントサービスを通して、Amazonプライムの有料会員登録をしない設定に変更されない限り、最初の6か月の無料体験期間終了後、自動的に Prime Student のヘルプページに記載された年会費の有料会員となり、最長で4年半(無料体験期間を含む)Prime Student 会員プログラムをご利用できます(1年毎の自動更新)。
ああ,もうそんな時期なのか
と言うかそんなに学生やってるのか.
そもそも,切れる3ヶ月前にこんなメールが来ます.
Prime Studentをご利用いただき、ありがとうございます。
このままですと、お客様のPrime Student会員資格は2018/01/ 05に終了してしまいます。学生証明書を提出いただくだけで、 もう1年プライムの半額の年会費でプライム特典をお楽しみいただ けます。こちらのリンクから2018/03/ 06までに会員資格の延長手続きを行ってください。
このメールに気が付かなかったわけですね.
Amzaonから通常のプライム料金3900円を請求されてから気が付きました.
解決法
Amazon.co.jp ヘルプ: Prime Student会員資格を延長する
ここにアクセスしてリンク先から学生証などのスキャン(写真)を添付してください.
今審査中ですが,まだ学生なので審査は通るはず.
よくみたら卒業後も残っている期間はPrime Studentの資格のままみたいですね.
まあ,(卒業できれば)4月から移籍するのですが….
もう7年も学生なんですね(震え)