質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • JavaScript

    15274questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Java

    13144questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Python

    6839questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Go

    456questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

mp4ファイルを読み込んで音量/秒のデータを返したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 361

smith_30

score 18

 解決したいこと

mp4ファイル(h264 / aaclc)を読み込んで
以下のようなjsonを返したい。

[
  {
     timestamp: ""
     db: ""
  },
  {
     timestamp: ""
     db: ""
  },
  .
  .
  .
  .
]

dbはデシベルで、要は一定間隔の音量データを返したいです。
timestampは取れたらいいなくらいで、なくてもいいです。

golangでやろうとしています。

 わかっていること

golangの下記ライブラリでファイルを読み込み、AudioFlameを取得するところまではできています

https://github.com/nareix/joy4
https://github.com/nareix/joy4/blob/master/examples/audio_decode/main.go

 わからないこと

上記のフレームに含まれる1024個のPCMサンプルデータから音量を計算すればいいのかと思っているのですが
そもそもこの方針であっているのか。

あっているのであれば計算方法をご教授いただけると助かります。

見当違いであれば、どうすれば私の実現したいことが叶うかご教授いただけると助かります。
私のやりたいことと近いことをやっているOSSのライブラリ教えてくださるだけでも大きな前進になるので
よろしくお願いします。

また、10msec, 100msec, 1sec ごとのdbを計算していく方法も知りたいと思っています。

 補足

サンプルで使っているのはこんなファイルです

$ ffprobe sample_360x240_1mb.mp4 -pretty -hide_banner
Input hoge
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01T00:00:00.000000Z
    encoder         : Lavf53.24.2
  Duration: 00:00:13.70, start: 0.000000, bitrate: 615 kb/s
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 320x240 [SAR 1:1 DAR 4:3], 229 kb/s, 15 fps, 15 tbr, 15360 tbn, 30 tbc (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 382 kb/s (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : SoundHandler
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2017/10/03 12:12

    https://blogs.yahoo.co.jp/boorankenko/44270834.html このページを参考に、当該データの量子化ビット数やサンプリングレートから換算することになります。

    キャンセル

回答 1

checkベストアンサー

0

音声処理に興味があるのでちょっとだけ調べてみました。自信はないです。

振幅から音量を計算させたい
RMSとは

色々な表現があるようですね。スピーカーで再生した際の絶対的な大きさとして表現したりは難しそうです。しかし上記ページにあるRMSというものなら簡単に計算できそうです。計算内容からすると音声データで表現できる範囲での相対的な音のパワーを計算するものみたいです。

参照ページに計算方法が書いてありますが、ある区間の波形データを正規化(例えば16bit PCMなら-32768 ~ 32767の範囲を-1.0 ~ 1.0に正規化)して、二乗したものの平均をとり、その平方根をxとすると、20*log10(x) [dB]とすればいいようです。

残念ながらgoは全くしらないのですが、質問タグにjavaが含まれているので、Javaコードを貼っておきます。

int[] pcm = { ... }; // 16bit PCMデータ(-32768 ~ 32767)を想定

double x = 0.0;
for (int i = 0; i < pcm.length; i++) {
  double normalized = pcm[i] / 32768.0; // -1.0 ~ 1.0に正規化
  x += normalized * normalized;
}
x = Math.sqrt(x / pcm.length);
double rms = 20 * Math.log10(x);
System.out.println("rms = " + rms + " [dB]");


(なお、利用しておられるライブラリーで得た波形データが既に-1.0 ~ 1.0に正規化されてるなら正規化部分はもちろん不要です)

ためしに16bit PCMの正弦波のサンプル波形を作ってやってみると、次のような値でした。

 振幅(正規化済み)   RMS [dB] 
 最大(-1.0 ~ 1.0)   -3.01 
 最小(-3.05E-5 ~ -3.05E-5)   -93.32 

最大振幅は滑らかなデータですが、最小振幅の方は{ 0, +3.05E-5, 0, -3.05E-5, 0, ... }のようなデータです。量子化されてるデータなので、振幅最小だとこれ以上滑らかにしようがないので・・・

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    15274questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Java

    13144questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Python

    6839questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Go

    456questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。