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

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

ただいまの
回答率

91.39%

  • Java

    10434questions

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

  • Android Studio

    2698questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

androidでリアルタイムで録音した音声にリバーブをかける

受付中

回答 0

投稿 2017/11/28 20:49 ・編集 2017/11/30 15:53

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

riku0307

score 1

androidでaudiorecord、audiotrackを用いてリアルタイムで録音した音声にリバーブをかけたいと考えています。なので、EnvironmentalReverbクラスを用いようと考えているのですが、後述のプログラムでも効果が現れません。どなたか、詳しい方、アドバイスいただけると幸いです。
また、私自身、やることを断念しましたが、直接音声データにリバーブをかける方法がもしありましたらお願いします。

package com.example.audioplayer;

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder.AudioSource;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.media.AudioTrack.Builder;
import android.media.audiofx.PresetReverb;
import android.media.audiofx.EnvironmentalReverb;

import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;


import java.nio.ByteBuffer;


public class MainActivity extends Activity {
    AudioRecord audioRec = null;
        Button btn = null;
        boolean bIsRecording = false;
        int bufSize ;
        int samplingRate ;
        private AudioTrack audioTrack;
    private void recodingAndPlay() {
        if (bIsRecording) {
            bIsRecording = false;
        } else {
            // 録音開始
            Log.v("AudioRecord", "startRecording");
            audioRec.startRecording();
            bIsRecording = true;
            // 録音スレッド

            new Thread(new Runnable() {
                @Override
                public void run() {
                                       EnvironmentalReverb mReverb = new EnvironmentalReverb(0,0);
                    mReverb.setDecayHFRatio((short) 1000);
                    mReverb.setDecayTime(10000);
                    mReverb.setDensity((short) 1000);
                    mReverb.setDiffusion((short) 1000);
                    mReverb.setReverbLevel((short) -1000);
                    audioTrack.setAuxEffectSendLevel(1.0f);

                    mReverb.setEnabled(true);
                    audioTrack.attachAuxEffect(mReverb.getId());
                    Log.e("DEBUG","sessionId : " + audioTrack.getAudioSessionId());

                    while (bIsRecording) {

                        audioRec.read(buf,0,buf.length,AudioRecord.READ_NON_BLOCKING);
                                              audioTrack.write(buf, 0, buf.length, AudioTrack.WRITE_NON_BLOCKING);
                        offset += buf.length;
                        if(offset >= bufSize){
                            offset = 0;
                        }

                 Log.d("AudioRecord", "read " + buf2.length +
                    " bytes");
        }
        // 録音停止
        Log.v("AudioRecord", "stop");
        audioRec.stop();
    }
}).start();

        }
    }


    public AudioRecord findAudioRecord() {
        int rate = 44100;


                short audioFormat = AudioFormat.ENCODING_PCM_FLOAT;
                short channelConfig = AudioFormat.CHANNEL_IN_MONO;

        try {
                    Log.d("TAG", "Attempting rate " + rate + "Hz, bits: "
                            + audioFormat + ", channel: " + channelConfig);
                    int bufferSize = AudioRecord.getMinBufferSize(rate,
                            channelConfig, audioFormat);




                    if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
                        // check if we can instantiate and have a success
                        AudioRecord recorder = new AudioRecord(
                                AudioSource.DEFAULT, rate, channelConfig,
                                audioFormat, bufferSize );

                        if (recorder.getState() == AudioRecord.STATE_INITIALIZED)
                        bufSize = bufferSize ;
                        samplingRate = rate;



                        Log.d("TAG2", "buffersize " + bufSize);
                        return recorder;
                    }
                } catch (Exception e) {
                    Log.e("TAG", rate + "Exception, keep trying.", e);
                }


                return null;
            }

            @Override
            protected void onCreate (Bundle savedInstanceState){
                        super.onCreate(savedInstanceState);
                            setContentView(R.layout.activity_main);

// AudioRecordの作成
                            audioRec = findAudioRecord();
                audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, samplingRate,
                        AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_FLOAT, bufSize, AudioTrack.MODE_STREAM);
                audioTrack.play();

                findViewById(R.id.button).setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        recodingAndPlay();
                    }
                });
            }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

ただいまの回答率

91.39%

関連した質問

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

  • Java

    10434questions

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

  • Android Studio

    2698questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。