2021年7月31日土曜日

動画ファイルの一覧を作成し、ファイルサイズ順に並べ替えて出力するスクリプト

容量の大きな動画ファイルに ffmpeg で再エンコードを掛けたい場合等に、ファイルの一覧を作成して容量順にソートするスクリプトです。
カレントフォルダ以下の動画ファイルを並べ替えて出力します(対応する拡張子は @mvext で指定)。 実行結果

2021年7月17日土曜日

VLC用のプレイリストを作成するスクリプト

色んな環境で利用できる VLC ですが、サブフォルダの展開が行われず、ランダム再生しようとしてもトップのフォルダしか再生されないと言うことが多々あります。
サブフォルダを一つ一つリストからクリックして展開すると利用可能になりますが、あまりにも使い勝手が悪いので、その手間を省く方法を考えてみました。

以下のスクリプトを実行すると、XSPF と言う XML形式のプレイリストが出力されます。
出力される内容をファイル保存し、VLC で再生するとサブフォルダの内容もはじめから展開された形で再生が可能になります。 実行例

2021年7月9日金曜日

自宅PCのグローバルIPアドレスをメール送信するスクリプト

自宅PCのSFTP等にアクセスしたいとき、自宅サーバーのアドレスを外部サーバー等を利用せずに定期的に知らせてくれるスクリプトを書いてみました。
Postfix で Gmail へ送信できる環境を整えておき(OSX postfix 等参照)、グローバルIPが変更される度にメールを送信してくれるスクリプトになります。

スクリプトを実行すれば curl が http://ifconfig.co/ にアクセスしてIPアドレスを取得し、その結果をコンフィグファイルに書き出します。
その結果が変更されればメールを送信します。
crontab に登録しておけばアドレスが変更されても自宅PCにアクセスすることができます(まだ未検証ですが)。

crontab に登録しておく

2020年1月3日金曜日

libcurl を用いた画像のPOST(multipart/form-data or raw 形式)

libcurl を用いて画像をPOST(multipart/form-data or raw 形式)する例題です。

multipart/form-data にて Base64化された送信(CURL_PostFormMedia)と、バイナリ形式での送信(CURL_PostRawMedia)をそれぞれ切り替えて利用することが出来ます。
サーバー側の実装例も合わせて記載(CGIを実行する際の引数で受信する形式を切替)。

multipart/form-data で送信する際には、ファイルが埋め込まれたフィールド名(<input type="file" name="file" />)を送受信側で合わせる必要があります。
サーバー側の form 内に、<input type="file" name="file"> と記載されている場合には name で指定されている "file" というフィールドに画像データを埋め込んで送信する必要があります(下記実装例では、CURL_PostFormMedia 関数の引数 fdname で指定しています)。

サーバ側実装例(perl/cgi)

サーバー側では GET で画像ファイルをPOSTする form を表示し、自分自身に画像をPOSTする実装となっています。
また、このCGIに直接画像をPOSTする際には引数にて(postimage.cgi?name=sample.jpg&type=raw) と指定すればバイナリ形式での受信も可能となります。 実行結果

2019年1月1日火曜日

フォントを指定して文字列画像の作成(libgd):絵文字対応

フォントを指定して文字列画像の作成(libgd)する例題です。

文字列中の絵文字を、twemoji にて用意されている絵文字画像で置き換えながら描画していきます。
指定されたフォントで割り当てられていない文字や絵文字は「?」で表示されます。
また、UTF-8 文字列を UNICODE化(32bit)し、Freetype により一文字ずつ描画可能な文字かどうかを判定しています(FT_Get_Char_Index)。

ビルドするには libgd/freetype2/libpng が必要となります。
実行ファイルと同じパスに NotoSansCJKjp-Regular.otf と、twemoji からダウンロードした絵文字画像を配置してください。 実行結果 ALIGN=center/left/right の順に作成した結果。

2018年12月29日土曜日

UTF-8文字列をUNICODE化し、絵文字判別

UTF-8で指定された文字列をUNICODE化し(32bit)、絵文字かどうかを判定する例題です。

絵文字かどうかの議論は色々あるかと思いますが、twemoji 内に格納されている絵文字を基準としています。
→ emoji-png フォルダに png として保存し、ファイルを検索してチェック

絵文字かどうかを判定した後は元のUTF-8に戻し、標準出力へ出力しています。
絵文字に対応していないフォントを用いているUI等では、絵文字が表示されない場合がありますので、絵文字の部分は twemoji 内の png で置き換えて表示したりすることができます。 実行結果

2018年9月23日日曜日

Broadcast Wave Format に対応した WAVE 音声の読み込み

Broadcast Wave Format に対応した WAVE 音声の読み込みの例題です。
Broadcast Wave Format (BWF) は、マイクロソフトのWAV音声ファイルフォーマットの拡張であり、映画やテレビで使われているノンリニアデジタルレコーダーの録音フォーマットとしてよく使われている。
WAVEファイルの読込み/再生 での例題で WAVEファイルを読み込んだ際、ヘッダ部分がうまく取得できないWAVEファイルが存在していました。
中身を見ると、フォーマット用のチャンク部分に「fmt 」ではなく、「bext」と記載されているファイル形式のファイルでした。
PCMの音声データ部分のチャンクは「data」から始まり、PCM音声部分の抜き取りは正常に動作していたのですが、元の音声の形式がどのようなものかを正常に取得できていないので困ることになります。
なので、この「bext」のチャンクが含まれる Broadcast Wave Format の WAVE 形式にも対応した形で読み込み部を修正しています。

Broadcast Wave Format(BWF)は CM 位置へのスキップ等に対応した CUE というイベント情報等を含められるようですが、今回はヘッダ部分のパースと WAVE の保存形式を正常に認識するための修正のみを行っています(CUE が入った音声サンプルが手に入らないため)。

また、4GBの壁にも対応した修正になっています(本来はWAVE64というフォーマットがありますが、WAVEに4GB以上のデータが含まれるもの)。
WAVEファイルのヘッダ構造体は32bitですのでその部分で4GBの壁となります。
WAVEで保存するICレコーダー等で4GB以上の録音となる場合にこういった不具合が発生することがあります。
data チャンクの長ささえ取得できれば音声部は正しく保存されていますので、その部分から読み込みを開始すればデータ部は正しく取得できます。 実行結果