ReplayGain
【保証付】【国内正規品】【500円クーポン発行中】ANKER soundcore ワイヤレススピーカー SOUNDCORE 3 ブラック【全国送料無料 年中無休】 楽天で購入 ReplayGainとは、音声ファイルを再生する際に音量を揃える機能です。音楽で彩るタスク管理アプリ(Assistants)に実装したのですが、イマイチだったのでお蔵入り。検証で実装したものを残します。検証なので、コードは汚いです。 @SuppressLint("DefaultLocale") public Uri gain(String source, Uri uri) { ExternalStorageReader externalStorageReader = new ExternalStorageReader(context); String out = context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS) + File.separator + source; String in = FFmpegKitConfig.getSafParameterForRead(context, uri); FFmpegSession session = FFmpegKit.execute(String.format(Locale.getDefault(), "-i '%s' -vn -af volumedetect -f null -", in)); String msg = session.getOutput(); int S = msg.indexOf("max_volume:"); int E = S > 0 ? msg.indexOf("dB", S) : 0; String info = E > 0 ? msg.substring(S + 11, E) : ""; float gain = !info.isEmpty() ? Float.parseFloat(info) : 0; if (gain < 0 && !externalStorageReader.setFile(source, 0)) { in = FFmpegKitConfig.getSafParameterForRead(context, uri); session = FFmpegKit.execute(String.format(Locale.getDefault(), "-i '%s' -f mp3 -acodec libmp3lame -ab %d -ar %d -af 'volume=%.1fdB' -y '%s'", in, mainActivity.MP3AB, mainActivity.MP3AR, -gain, out)); if (ReturnCode.isSuccess(session.getReturnCode())) { return externalStorageReader.getUri(source, 0); } else { Log.d(TAG, session.getOutput()); Log.d(TAG, String.format("FFmpegKit: %s trace: %s(%s)", session.getState(), session.getFailStackTrace(), session.getReturnCode())); } } return uri; }ffmpegを使用します。まず、volumedetect でmax_gainを取得して、負の場合に、volumeをmax_gainの逆数で変換を掛けます。これで、gain = 0dbのファイルができます。関数自体は、対象がファイルのUriを渡して、変換できたら変換後のファイルのUriを返却します。なんとなく、音量が上がったような気がするレベルで極端に音量が低い場合でしか、気が付かないと思います。gain = 0dbでなく、更に大きくできますが、音が割れるのでオススメしません、アンプを使わずに、ボリュームだけMAXにした時に近い感じです(笑)ポチッとして頂けると、次のコンテンツを作成する励みになります♪