simotin13's message

simotin13といいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

FFmpegのコードを読み始めた

自分向けの備忘録です。

ソースコードの入手とビルド

ソースコードの入手

githubにミラーされているのでclone
github.com

ビルド方法

Ubuntu上で作業をしているので以下のページを参照します。
trac.ffmpeg.org

aptで色々と入れる必要はあります。

sudo apt update
sudo apt install nasm yasm libx264-dev libnuma-dev libx265-dev libvpx-dev libfdk-aac-dev libopus-dev libaom-dev autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libgnutls28-dev libmp3lame-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev meson ninja-build pkg-config texinfo wget libunistring-dev libsvtav1enc-dev libvorbis-dev

私の環境では依存関係の問題などが出ましたがとりあえず以下の./configureが通るようになりました。

./configure --prefix="$HOME/ffmpeg_build" --pkg-config-flags="--static" --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --extra-libs="-lpthread -lm" --ld="g++" --bindir="$HOME/bin" --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libsvtav1 --enable-libdav1d --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree

./configureが通れば makeコマンドを叩くだけですんなりビルドできました。

mp4のフォーマットに関する部分を知りたい

自分が作っているRTSPのクライアントではH.264の動画を.mp4のファイルに保存する(録画)機能を実装しようとしています。
H.264AACのパケットを受信するところまではできるようになったのですが、mp4のフォーマットをどのように出力するのかがよく分かっていません。

mp4にはアトムやボックスと呼ばれるデータ構造の単位がありこのデータ構造に動画や音声のデータを入れたり、動画の再生などで必要となるメタデータを入れる必要があります。
どのようなボックスにどういったデータがあるのかはある程度理解できてきたのですが、細部については不明な点が多いので理解のためにFFmpegのコードを読むことにしました。

libavformatを読む

FFMpegはマルチメディア処理に関連するいくつかのモジュール群から構成されています。
私が知りたいのはmp4のデータフォーマットの書き込み(エンコード)方法なのですが、これは libavformat というディレクトリ以下で実装されています。
mp4のボックスに関するコードは moven.cで主に実装されていました。

例えば mp4のファイルの先頭にはftypというメタデータ用のボックスが格納される必要がありますが、これは mov_write_ftyp_tag という関数で実装されています。
ファイルへの書き込み処理はメインスレッドとは別スレッドで行われます。

とりあえずどの辺で書き込みが実装されているかは把握できたので続きは別の日にします。

自宅に太陽光発電を設置した結果~2年目~

太陽光発電・蓄電池のシステムを自宅に設置して2年目の結果が出たので簡単に振り返ってみたいと思います。(厳密には2年と半年ほどになります)

1年目の結果は以下の記事を参照。
mcommit.hatenadiary.com

2023年のデータ

発電データとグラフは以下のような結果でした。

2023年発電データ
2023年発電グラフ

2年間の推移

発電量(kWh) 消費量(kWh) 売電量(kWh) 買電量(kWh) 蓄電池放電量(kWh) 自給率(%)
2022 2,378 4,306 386 2,397 1,047 55
2023 2,441 4,344 435 2,423 1,030 56

2年目までの推移は上記の通りです。
化内容を見ると、

  • 発電量が63kWh増えた
  • 消費量が26kWh増えた
  • 売電量が49kWh増えた
  • 買電量が26kWh増えた
  • 蓄電池放電量が17kWh減った
  • 自給率は1%増えた

という結果です。

シミュレーション結果との比較

導入時に営業の人が持ってきたシミュレーション結果との比較を見てみましょう。
年間推定発電量は2,921kWhなので2023年の結果と比較すると480kWhの差異があり、金額にすると約10,000円程度はシミュレーション結果より損した結果になっています。
この点は2022年の結果と同じですね。

https://cdn-ak.f.st-hatena.com/images/fotolife/s/simotin13/20230129/20230129011749.png

電気料金と再エネ賦課金の推移について

再エネ賦課金は2022年度は3.45円/kWhでしたが、2023年は1.4円/kWhになっています。
これは再エネ賦課金を求める式のうち、「回避可能費用」に相当する金額が大幅に上がったためだそうです。
再エネ賦課金は2023年は下がりましたが、基本的には2030年までは上昇すると予想されています。

感想

太陽光発電・蓄電池のシステムは得か損か」の最終的な結果を知るために毎年このような振り返りの記事を書いてみていますが今のところ「やや損している」といったところでしょうか。
得をしているということはつまり電気代が上昇しているということなのでそれ自体は素直に喜べる状況ではないのですが、今年もまた電力事情には注目しておきたいと思います。

yoctoでビルドしたイメージをBeagleBoneBlackで動かす~【kirkstone的令和最新版】~

2019年にyoctoに入門してみたという記事を書いていましたが、久しぶりにyoctoを触ってみると yocto project も4.x系がリリースされており記事を書いた当時と状況が変わっています。

mcommit.hatenadiary.com

2019年に書いた記事の内容に沿って、yoctoでビルドしたイメージをBeagleBoneBlackで動かそうとした動かなかったので改めて最近のyoctoでビルドしたイメージをBeagleBoneBlackで動かす手順について触れておきたいと思います。

目次

  • 目次
  • kirkstoneを使ったビルド
    • 環境構築
    • Poky の入手
    • local.conf の変更とビルドの実行
  • 重要!SDカードへのイメージの書き込み手順
    • SDカードのデバイスファイルについて
    • 手っ取り早く試したい人向け~ddコマンドによるイメージの書き込み~
  • 自分でSDカードに必要なファイルを配置していく方法
  • 実機での起動
  • まとめ

kirkstoneを使ったビルド

今回の記事では直近のLTSとして公開されている Kirkstone(4.0)を使ったビルドしてみます。

公式サイトからはQuick Buildの記事が公開されています。
docs.yoctoproject.org

続きを読む

gstreamerでRTSPのストリーミングを音声付で録画する

ここ最近 gstreamer をよく使っているのですが、gstreamer は日本語の情報が少ないので使い方などについてメモ書きしておきたいと思います。

目次

  • 目次
  • gstreamerとは何か
  • インストール
  • 利用するカメラについて
    • C210の初期設定
  • gstreamerを使って録画してみる
    • 映像のみの動画を録画する
    • 音声ありの動画を録画する
  • まとめ

gstreamerとは何か

一言で言えば動画や音声を扱う便利なオープンソースのライブラリ+ツール一式でしょうか。
gstreamerではカメラの映像を配信することや配信されている映像をファイルに録画したりと色々な機能が提供されています。
動画のみや音声のみ、あるいは特定プロトコルやコーディックのみをサポートしたオープンソースのマルチメディア系のライブラリはありますが、gstreamerはサポートしているコーディックや機能が幅広く、マルチメディア系ライブラリの一強と言っても過言ではないかと思います。

ちなみに、公式のドキュメントは整備されていますが、やりたいことに対して具体的に何をする必要があるのか・どういったパイプラインを記述するのかなかなか直ぐには分かりません。
gstreamer.freedesktop.org

続きを読む

flockでは排他できない

ずいぶんと煽ったタイトルをつけてみましたが、Linuxでファイルアクセスを排他しようとして苦労したので書いておきたいと思います。

結論

結論から申しますと、上書きモード(fopenのオプションで言うと"w")で書き込みを行うファイルに対してはflockで排他ができません。

flockを普段から使っていなかった私にとってはこのふるまいに割と衝撃を受けたのですが、確信を得るために検証コードでの動作確認と、ファイルシステム(システムコールからVFSあたりまで)のコードを読んでみました。
もし、この記事の内容で認識が違ってそうな点などありましたらコメントやTwitter(@simotin13)でご指摘頂けると幸いです。

なお、この記事で書いている確認用コードは以下のレポジトリにまとめています。
github.com

続きを読む