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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Go

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

Java

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

JavaScript

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

Python

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

Q&A

解決済

1回答

5465閲覧

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

smith_30

総合スコア26

Go

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

Java

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

JavaScript

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

Python

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

0グッド

0クリップ

投稿2017/10/03 02:18

解決したいこと

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

json

1[ 2 { 3 timestamp: "" 4 db: "" 5 }, 6 { 7 timestamp: "" 8 db: "" 9 }, 10 . 11 . 12 . 13 . 14]

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

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

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

java

1int[] pcm = { ... }; // 16bit PCMデータ(-32768 ~ 32767)を想定 2 3double x = 0.0; 4for (int i = 0; i < pcm.length; i++) { 5 double normalized = pcm[i] / 32768.0; // -1.0 ~ 1.0に正規化 6 x += normalized * normalized; 7} 8x = Math.sqrt(x / pcm.length); 9double rms = 20 * Math.log10(x); 10System.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, ... }のようなデータです。量子化されてるデータなので、振幅最小だとこれ以上滑らかにしようがないので・・・

投稿2017/10/06 12:34

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問