AVAsset を使ってデータを読み込む、と。 なるほど、たしかに…トラック全長のうち、N msecごとに音量取ってグラフにしてもなんか違う気がしてた。 音声データの最小フレーム単位ごとに音量データ欲しいよね。そうしないと拡大縮小がちゃんと出来ないし、 再生位置とグラフ上の位置の対応も不正確になっちゃう。
こっちも使えるのかな。
AudioToolbox | Apple Developer Documentation
えーとあとはcoreaudioか。
んー、AudioKitとEZAudioのExample見てるとそんなことしなくて素直にそれらサードパーティライブラリを使えばはやそうだけど…
でも、でも、自力で
- 波形が書ける
- OpenGLで描画出来る
ようになったら、なんか嬉しいし、もうちょっと頑張りたい。
音声の、powerとデシベルと、波形出力するときにマイナス値の増減をどう正の値に反転していいか分からない。もっと大学で勉強しとけばよかった…
— Yuki Yokoyama69kg (@peketamin) January 15, 2017
https://t.co/Xrqzdgvjfu これか!?
— Yuki Yokoyama69kg (@peketamin) January 15, 2017
https://t.co/KAPFtNGYbs こっちか!
— Yuki Yokoyama69kg (@peketamin) January 15, 2017
abs(power) するだけだと、メーターの増減が変に…大きい音ほど低いバーになってしまう…
— Yuki Yokoyama69kg (@peketamin) January 15, 2017
https://t.co/L74nO4AmqW
— Yuki Yokoyama69kg (@peketamin) January 15, 2017
func decibel(_ amplitude: CGFloat) -> CGFloat {
return 20.0 * log10(abs(amplitude))
}
はむ…
デシベルってなんでマイナスなの?
— Yuki Yokoyama69kg (@peketamin) January 15, 2017
@shunsukeaihara おおお、 log(sample power / max power) = log(sample power) - log(max power) だからですか!ありがとうございます!😂
— Yuki Yokoyama69kg (@peketamin) January 15, 2017
power, amplitude, intensity, level, gain, decibel の関係についても全然分かってないし、RMS (root mean square) についても知らなかったし。
Audacity Waveform - Audacity Manual
あ、でも下手に自分でやるより、EZAudioのソース参考にした方が良いかな…?いや、ちょっと自分でやって見て、分かんなかったら答え見る方がセオリー的にも良さそう。
んー、リアルタイムでプロットしていくのはあったけど、波形全長を描画してズームしたりするのはないっぽい…?
ffmpeg -i input -filter_complex "showwavespic=split_channels=1" output.png
ffmpeg -i input -filter_complex \ "showwaves=s=600x240:mode=line:split_channels=1,format=yuv420p[v]" \ -map "[v]" -map 0:a -movflags +faststart output.mp4
おお、ffmpeg にもそういう機能が!ただ、再生シーク位置と同期するには難しそう…?
えーと、
- AVFoundation /AVAsset
- CoreMedia
- CoreAudio
このへんを当たろう。
描画は、細かくベクタで線が引ければ、滑らかズームはできるのでは…。
やっぱり FDWaveformView/FDWaveformView.swift at master · fulldecent/FDWaveformView · GitHub が参考になるのかな。