カテゴリ:仕事
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にした時に近い感じです(笑) ポチッとして頂けると、 次のコンテンツを作成する励みになります♪ お気に入りの記事を「いいね!」で応援しよう
最終更新日
2024.11.03 14:19:07
コメント(0) | コメントを書く |