質問編集履歴

5 前回は手動で行っていましたが、今回は録音終了時に自動でトリミングし、保存したいです。

slvg8122

slvg8122 score 4

2018/06/05 01:27  投稿

wavファイルのトリミング処理をしたいです。
### 前提・実現したいこと
 Android Studio(Java)で、音声ファイル(wav)をトリミングをするアプリを作っています。
 Android Studio(Java)で、録音終了後に内部ストレージから録音した音声を取得し、その音声ファイルに記録されている音声(=例:「◯◯ありがとう」「ありがとう◯◯」「◯◯ありがとう◯◯」など)から取得したい指定の言葉(例:「ありがとう」)が含まれているかを認識したあと、その指定の言葉(例:「ありがとう」)の音声のみを取得し、端末に保存したいです。
※①部分で処理を書き込みたいです。
 
### 発生している問題点・エラーメッセージ
 今現在では、RangeSeekBarを用いて、トリミングを行いたい開始時間と終了時間の取得(①)はできていますが、
 その指定した区間で、ボタンをクリックすることでトリミングを行うにはどのようなメソッドが必要なのかがわからない
 ことと、そのデータをrawディレクトリ内に入れて保存する作業ができていないのが現状の問題点です。
現時点では、他のサイトを調べていますが、録音終了後に音声認識を行う処理が調べても出てこないため、どのようにしていくのかもわからない状態です。
### ソースコード
 ※()内はidです。
 ・音声(または音楽)を開始位置を動かすために使用する(途中再生など)「seekbar(VoiceSeekBar)」
 ・音声(または音楽)を再生、一時停止をするために使用するボタン「Button(start)」
 ・音声(または音楽)のトリミングを開始・終了する時間を調節する「RangeSeekBar(trimmingBar)」
 ・音声(または音楽)の再生時間を表示する「TextView(timeLabel)」
 ・音声(または音楽)をトリミングするボタン「Button(trimmingButton)」
 ・音声(または音楽)のトリミングを開始する時間を表示する「TextView(startTrimmingTime)」
 ・音声(または音楽)のトリミングを終了する時間を表示する「TextView(stopTrimmingTime)」
```MainActivity.java
import android.media.MediaPlayer;
```Android Studio(java)
### MainActivity.java
import android.content.Intent;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Environment;
import android.speech.RecognizerIntent;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;  
import android.widget.SeekBar;  
import android.widget.TextView;
import android.widget.Toast;  
import com.yahoo.mobile.client.android.util.rangeseekbar.RangeSeekBar;
import java.io.IOException;
import java.io.File;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
   MediaPlayer mediaPlayer = null;
   Button buttonStart;
   SeekBar VoiceseekBar;
   int duration;
   TextView timeLabel;
   TextView startTrimming;
   TextView stopTrimming;
   String maxtimelabel;
   RangeSeekBar trimmingBar;
   Object start;
   Object stop;
   AudioRecord audioRecord; //録音用のオーディオレコードクラス
   MediaRecorder mediaRecorder;
   final static int SAMPLING_RATE = 44100; //オーディオレコード用サンプリング周波数
   private int bufSize;//オーディオレコード用バッファのサイズ
   private short[] shortData; //オーディオレコード用バッファ
   private MyWaveFile wav1 = new MyWaveFile();
   private static final int REQUEST_CODE = 0;
   TextView textView;
   TextView textView2;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       //音声(または音楽)の再生時間を表示するTextView
       timeLabel = (TextView) findViewById(R.id.timeLabel);
       //トリミングを開始する時間を表示するTextView
       startTrimming = (TextView) findViewById(R.id.startTrimmingTime);
       //トリミングを終了する時間を表示するTextView
       stopTrimming = (TextView) findViewById(R.id.stopTrimmingTime);
       //音声ファイルを取得
       mediaPlayer = MediaPlayer.create(this,R.raw.sample01);
       mediaPlayer.seekTo(0);
       duration = mediaPlayer.getDuration();
       // 音声再生シークバー
       VoiceseekBar = (SeekBar) findViewById(R.id.voiceSeekbar);
       //VoiceseekBarの最大値設定
       VoiceseekBar.setMax(duration);
       VoiceseekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
           //ツマミがドラッグされると呼ばれる
       initAudioRecordButton();
       initAudioRecord();
   }
   //AudioRecordの初期化
   private void initAudioRecord(){
       wav1.createFile(Environment.getExternalStorageDirectory() + "/test.wav");
       // AudioRecordオブジェクトを作成
       bufSize = android.media.AudioRecord.getMinBufferSize(SAMPLING_RATE,
               AudioFormat.CHANNEL_IN_MONO,
               AudioFormat.ENCODING_PCM_16BIT);
       audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
               SAMPLING_RATE,
               AudioFormat.CHANNEL_IN_MONO,
               AudioFormat.ENCODING_PCM_16BIT,
               bufSize);
       shortData = new short[bufSize / 2];
       // コールバックを指定
       audioRecord.setRecordPositionUpdateListener(new AudioRecord.OnRecordPositionUpdateListener() {
           // フレームごとの処理
           @Override
           public void onProgressChanged(SeekBar seekBar, int progress, boolean input) {
               if(input){
                   mediaPlayer.seekTo(progress);
                   VoiceseekBar.setProgress(progress);
               }
           public void onPeriodicNotification(AudioRecord recorder) {
               // TODO Auto-generated method stub
               audioRecord.read(shortData, 0, bufSize / 2); // 読み込む
               wav1.addBigEndianData(shortData); // ファイルに書き出す
           }
           //ツマミがタッチされた時に呼ばれる
           @Override
           public void onStartTrackingTouch(SeekBar seekBar) {
           }
           //ツマミがリリースされた時に呼ばれる
           @Override
           public void onStopTrackingTouch(SeekBar seekBar) {
           public void onMarkerReached(AudioRecord recorder) {
               // TODO Auto-generated method stub
           }
       });
       //
       new Thread(new Runnable() {
       // コールバックが呼ばれる間隔を指定
       audioRecord.setPositionNotificationPeriod(bufSize / 2);
   }
   /**
    * オーディオレコード用のボタン初期化
    */
   private void initAudioRecordButton(){
       View.OnClickListener startButtonClickListener = new View.OnClickListener() {
           @Override
           public void run() {
               while(mediaPlayer != null){
                   try{
                       Message msg = new Message();
                       msg.what = mediaPlayer.getCurrentPosition();
                       handler.sendMessage(msg);
                       Thread.sleep(1000);
                   }catch(InterruptedException e){}
               }
           }
       }).start();
       //音声(または音楽)の再生、一時停止ボタン
       buttonStart = (Button) findViewById(R.id.start);
       buttonStart.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v) {
               //クリック時にシークバーが動く処理(ボタンクリックでseekBarを止める(シークバーで表示(音声の現在の再生位置を取得)))
               VoiceseekBar.setProgress(mediaPlayer.getCurrentPosition());
               //音声再生、一時停止処理
               if (mediaPlayer.isPlaying()) {//再生中
                   buttonStart.setText("再生");
                   mediaPlayer.stop();
                   try {
                       mediaPlayer.prepare();
                   } catch (IllegalStateException e) {
                       e.printStackTrace();
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               }
               else { //停止中
                   buttonStart.setText("一時停止");
                   mediaPlayer.start();
               }
           public void onClick(View view) {
               startAudioRecord();
           }
       });
       //トリミングシークバー
       trimmingBar = (RangeSeekBar) findViewById(R.id.trimmingSeekBar);
       trimmingBar.setRangeValues(0,duration);
       maxtimelabel = createTimeLabel(duration);
       stopTrimming.setText(maxtimelabel);
       trimmingBar.setOnRangeSeekBarChangeListener(new RangeSeekBar.OnRangeSeekBarChangeListener(){
       };
       findViewById(R.id.startButton).setOnClickListener(startButtonClickListener);
       View.OnClickListener stopButtonClickListener = new View.OnClickListener() {
           @Override
       ①
           public void onRangeSeekBarValuesChanged(RangeSeekBar bar, Object minValue, Object maxValue) {
               //Object型からString型に変換
               String minstr = minValue.toString();
               String maxstr = maxValue.toString();
               //String型からint型に変換
               int minint = Integer.parseInt(minstr);
               int maxint = Integer.parseInt(maxstr);
               //0:00のような表示にする
               String minlabel = createTimeLabel(minint);
               String maxlabel = createTimeLabel(maxint);
               //トリミングする開始時間と終了時間を表示する
               startTrimming.setText(minlabel);
               stopTrimming.setText(maxlabel);
           public void onClick(View view) {
               stopAudioRecord();
           }
       });
       };
       findViewById(R.id.stopButton).setOnClickListener(stopButtonClickListener);
       final Button trimmingButton = (Button) findViewById(R.id.trimmingButton);
       trimmingButton.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v) {
               //トリミング開始時間の取得
               start = trimmingBar.getSelectedMinValue();
               String min = start.toString();
               int trimstart = Integer.parseInt(min);
               String mincurrent = createTimeLabel(trimstart);
               System.out.println(mincurrent);
               //トリミング終了時間の取得
               stop = trimmingBar.getSelectedMaxValue();
               String max = stop.toString();
               int trimstop = Integer.parseInt(max);
               String maxcurrent = createTimeLabel(trimstop);
               System.out.println(maxcurrent);
               **//トリミングの作業をここで行い、ディレクトリに挿入する**
               ** //ここで処理を書き込んで処理をしたいです。**
           }
       });
//       playButton.setOnClickListener(new View.OnClickListener() {
//           @Override
//           public void onClick(View view) {
//               playRecord();
//           }
//       });
   }
   private Handler handler = new Handler(){
       @Override
       public void handleMessage(Message msg) {
           int currentPosition = msg.what;
           //update position time
           VoiceseekBar.setProgress(currentPosition);
           //update position label
           String Voicetime = createTimeLabel(currentPosition);
           timeLabel.setText(Voicetime);
       }
   };
   public String createTimeLabel(int time){
       String timeLabel = "";
       int min = time / 1000 / 60;
       int sec = time / 1000 % 60;
       timeLabel = min + ":";
       if(sec < 10){
           timeLabel += "0";
       }
       timeLabel += sec;
       return timeLabel;
   private void startAudioRecord(){
       audioRecord.startRecording();
       audioRecord.read(shortData, 0, bufSize/2);
   }
   //オーディオレコードを停止する  
   private void stopAudioRecord(){  
       audioRecord.stop();  
       File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test.wav");  
       if(file.exists()){  
           MediaRecorder mediaRecorder = new MediaRecorder();  
           mediaRecorder.start();  
           System.out.println("あります");  
           System.out.println(file);  
           ①**//↓ここに処理を書き込みたいです。↓//**  
           //fileの音声から言葉を認識する  
 
           //認識した音声から「ありがとう」がふくまれているのか  
 
           //「ありがとう」が含まれていれば、「ありがとう」を取得し、保存  
 
       ①**//↑ここに処理を書き込みたいです↑//**  
       }else{  
           System.out.println("ありません");  
       }  
   }  
}
```
```
  • Android Studio

    4895 questions

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

4 seekbarを二つ用いて使っていましたが、rangeseekbarを用いたことで、一つのseekbarで範囲を指定することができました。

slvg8122

slvg8122 score 4

2018/05/31 00:30  投稿

wavファイルのトリミング処理をしたいです。
### 前提・実現したいこと
 Android Studio(Java)で、音声ファイル(wav)をトリミングをするアプリを作っています。
### 発生している問題点・エラーメッセージ
 今現在では、RangeSeekBarを用いて、トリミングを行いたい開始時間と終了時間の取得(①)はできていますが、その  指定した区間で、ボタンをクリックすることでトリミングを行うにはどのようなメソッドが必要なのかがわからないことと、
 そのデータをrawディレクトリ内に入れて保存する作業ができていないのが現状の問題点です。
 今現在では、RangeSeekBarを用いて、トリミングを行いたい開始時間と終了時間の取得(①)はできていますが、
 その指定した区間で、ボタンをクリックすることでトリミングを行うにはどのようなメソッドが必要なのかがわからない
 ことと、そのデータをrawディレクトリ内に入れて保存する作業ができていないのが現状の問題点です。
### ソースコード
 ※()内はidです。
 ・音声(または音楽)を開始位置を動かすために使用する(途中再生など)「seekbar(VoiceSeekBar)」
 ・音声(または音楽)を再生、一時停止をするために使用するボタン「Button(start)」
 ・音声(または音楽)のトリミングを開始・終了する時間を調節する「RangeSeekBar(trimmingBar)」
 ・音声(または音楽)の再生時間を表示する「TextView(timeLabel)」
 ・音声(または音楽)をトリミングするボタン「Button(trimmingButton)」
 ・音声(または音楽)のトリミングを開始する時間を表示する「TextView(startTrimmingTime)」
 ・音声(または音楽)のトリミングを終了する時間を表示する「TextView(stopTrimmingTime)」
```MainActivity.java
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import com.yahoo.mobile.client.android.util.rangeseekbar.RangeSeekBar;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
   MediaPlayer mediaPlayer = null;
   Button buttonStart;
   SeekBar VoiceseekBar;
   int duration;
   TextView timeLabel;
   TextView startTrimming;
   TextView stopTrimming;
   String maxtimelabel;
   RangeSeekBar trimmingBar;
   Object start;
   Object stop;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       //音声(または音楽)の再生時間を表示するTextView
       timeLabel = (TextView) findViewById(R.id.timeLabel);
       //トリミングを開始する時間を表示するTextView
       startTrimming = (TextView) findViewById(R.id.startTrimmingTime);
       //トリミングを終了する時間を表示するTextView
       stopTrimming = (TextView) findViewById(R.id.stopTrimmingTime);
       //音声ファイルを取得
       mediaPlayer = MediaPlayer.create(this,R.raw.sample01);
       mediaPlayer.seekTo(0);
       duration = mediaPlayer.getDuration();
       // 音声再生シークバー
       VoiceseekBar = (SeekBar) findViewById(R.id.voiceSeekbar);
       //VoiceseekBarの最大値設定
       VoiceseekBar.setMax(duration);
       VoiceseekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
           //ツマミがドラッグされると呼ばれる
           @Override
           public void onProgressChanged(SeekBar seekBar, int progress, boolean input) {
               if(input){
                   mediaPlayer.seekTo(progress);
                   VoiceseekBar.setProgress(progress);
               }
           }
           //ツマミがタッチされた時に呼ばれる
           @Override
           public void onStartTrackingTouch(SeekBar seekBar) {
           }
           //ツマミがリリースされた時に呼ばれる
           @Override
           public void onStopTrackingTouch(SeekBar seekBar) {
           }
       });
       //
       new Thread(new Runnable() {
           @Override
           public void run() {
               while(mediaPlayer != null){
                   try{
                       Message msg = new Message();
                       msg.what = mediaPlayer.getCurrentPosition();
                       handler.sendMessage(msg);
                       Thread.sleep(1000);
                   }catch(InterruptedException e){}
               }
           }
       }).start();
       //音声(または音楽)の再生、一時停止ボタン
       buttonStart = (Button) findViewById(R.id.start);
       buttonStart.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v) {
               //クリック時にシークバーが動く処理(ボタンクリックでseekBarを止める(シークバーで表示(音声の現在の再生位置を取得)))
               VoiceseekBar.setProgress(mediaPlayer.getCurrentPosition());
               //音声再生、一時停止処理
               if (mediaPlayer.isPlaying()) {//再生中
                   buttonStart.setText("再生");
                   mediaPlayer.stop();
                   try {
                       mediaPlayer.prepare();
                   } catch (IllegalStateException e) {
                       e.printStackTrace();
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               }
               else { //停止中
                   buttonStart.setText("一時停止");
                   mediaPlayer.start();
               }
           }
       });
       //トリミングシークバー
       trimmingBar = (RangeSeekBar) findViewById(R.id.trimmingSeekBar);
       trimmingBar.setRangeValues(0,duration);
       maxtimelabel = createTimeLabel(duration);
       stopTrimming.setText(maxtimelabel);
       trimmingBar.setOnRangeSeekBarChangeListener(new RangeSeekBar.OnRangeSeekBarChangeListener(){
           @Override
       ①
           public void onRangeSeekBarValuesChanged(RangeSeekBar bar, Object minValue, Object maxValue) {
               //Object型からString型に変換
               String minstr = minValue.toString();
               String maxstr = maxValue.toString();
               //String型からint型に変換
               int minint = Integer.parseInt(minstr);
               int maxint = Integer.parseInt(maxstr);
               //0:00のような表示にする
               String minlabel = createTimeLabel(minint);
               String maxlabel = createTimeLabel(maxint);
               //トリミングする開始時間と終了時間を表示する
               startTrimming.setText(minlabel);
               stopTrimming.setText(maxlabel);
           }
       });
       final Button trimmingButton = (Button) findViewById(R.id.trimmingButton);
       trimmingButton.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v) {
               //トリミング開始時間の取得
               start = trimmingBar.getSelectedMinValue();
               String min = start.toString();
               int trimstart = Integer.parseInt(min);
               String mincurrent = createTimeLabel(trimstart);
               System.out.println(mincurrent);
               //トリミング終了時間の取得
               stop = trimmingBar.getSelectedMaxValue();
               String max = stop.toString();
               int trimstop = Integer.parseInt(max);
               String maxcurrent = createTimeLabel(trimstop);
               System.out.println(maxcurrent);
               **//トリミングの作業をここで行い、ディレクトリに挿入する**
               ** //ここで処理を書き込んで処理をしたいです。**
           }
       });
   }
   private Handler handler = new Handler(){
       @Override
       public void handleMessage(Message msg) {
           int currentPosition = msg.what;
           //update position time
           VoiceseekBar.setProgress(currentPosition);
           //update position label
           String Voicetime = createTimeLabel(currentPosition);
           timeLabel.setText(Voicetime);
       }
   };
   public String createTimeLabel(int time){
       String timeLabel = "";
       int min = time / 1000 / 60;
       int sec = time / 1000 % 60;
       timeLabel = min + ":";
       if(sec < 10){
           timeLabel += "0";
       }
       timeLabel += sec;
       return timeLabel;
   }
}
```
  • Android Studio

    4895 questions

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

3 以前はseekbarを二つ用いて使っていましたが、rangeseekbarを用いたことで、一つのseekbarで範囲を指定することができました。

slvg8122

slvg8122 score 4

2018/05/31 00:30  投稿

wavファイルのトリミング処理をしたいです。
### 前提・実現したいこと
 Android Studio(Java)で、音声ファイル(wav)をトリミングをするアプリを作っています。
### 発生している問題点・エラーメッセージ
 今現在では、RangeSeekBarを用いて、トリミングを行いたい開始時間と終了時間の取得(①)はできていますが、その  指定した区間で、ボタンをクリックすることでトリミングを行うにはどのようなメソッドが必要なのかがわからないことと、
 そのデータをrawディレクトリ内に入れて保存する作業ができていないのが現状の問題点です。
### 問題が発生するまでの流れ・手順  
 トリミングを行いたい開始・終了時間の取得ができて、トリミングの作業に進めるために調べていったところ  
 
### ソースコード
 ※()内はidです。
 ・音声(または音楽)を開始位置を動かすために使用する(途中再生など)「seekbar(VoiceSeekBar)」
 ・音声(または音楽)を再生、一時停止をするために使用するボタン「Button(start)」
 ・音声(または音楽)のトリミングを開始・終了する時間を調節する「RangeSeekBar(trimmingBar)」
 ・音声(または音楽)の再生時間を表示する「TextView(timeLabel)」
 ・音声(または音楽)をトリミングするボタン「Button(trimmingButton)」
 ・音声(または音楽)のトリミングを開始する時間を表示する「TextView(startTrimmingTime)」
 ・音声(または音楽)のトリミングを終了する時間を表示する「TextView(stopTrimmingTime)」
```MainActivity.java
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import com.yahoo.mobile.client.android.util.rangeseekbar.RangeSeekBar;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
   MediaPlayer mediaPlayer = null;
   Button buttonStart;
   SeekBar VoiceseekBar;
   int duration;
   TextView timeLabel;
   TextView startTrimming;
   TextView stopTrimming;
   String maxtimelabel;
   RangeSeekBar trimmingBar;
   Object start;
   Object stop;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       //音声(または音楽)の再生時間を表示するTextView
       timeLabel = (TextView) findViewById(R.id.timeLabel);
       //トリミングを開始する時間を表示するTextView
       startTrimming = (TextView) findViewById(R.id.startTrimmingTime);
       //トリミングを終了する時間を表示するTextView
       stopTrimming = (TextView) findViewById(R.id.stopTrimmingTime);
       //音声ファイルを取得
       mediaPlayer = MediaPlayer.create(this,R.raw.sample01);
       mediaPlayer.seekTo(0);
       duration = mediaPlayer.getDuration();
       // 音声再生シークバー
       VoiceseekBar = (SeekBar) findViewById(R.id.voiceSeekbar);
       //VoiceseekBarの最大値設定
       VoiceseekBar.setMax(duration);
       VoiceseekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
           //ツマミがドラッグされると呼ばれる
           @Override
           public void onProgressChanged(SeekBar seekBar, int progress, boolean input) {
               if(input){
                   mediaPlayer.seekTo(progress);
                   VoiceseekBar.setProgress(progress);
               }
           }
           //ツマミがタッチされた時に呼ばれる
           @Override
           public void onStartTrackingTouch(SeekBar seekBar) {
           }
           //ツマミがリリースされた時に呼ばれる
           @Override
           public void onStopTrackingTouch(SeekBar seekBar) {
           }
       });
       //
       new Thread(new Runnable() {
           @Override
           public void run() {
               while(mediaPlayer != null){
                   try{
                       Message msg = new Message();
                       msg.what = mediaPlayer.getCurrentPosition();
                       handler.sendMessage(msg);
                       Thread.sleep(1000);
                   }catch(InterruptedException e){}
               }
           }
       }).start();
       //音声(または音楽)の再生、一時停止ボタン
       buttonStart = (Button) findViewById(R.id.start);
       buttonStart.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v) {
               //クリック時にシークバーが動く処理(ボタンクリックでseekBarを止める(シークバーで表示(音声の現在の再生位置を取得)))
               VoiceseekBar.setProgress(mediaPlayer.getCurrentPosition());
               //音声再生、一時停止処理
               if (mediaPlayer.isPlaying()) {//再生中
                   buttonStart.setText("再生");
                   mediaPlayer.stop();
                   try {
                       mediaPlayer.prepare();
                   } catch (IllegalStateException e) {
                       e.printStackTrace();
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               }
               else { //停止中
                   buttonStart.setText("一時停止");
                   mediaPlayer.start();
               }
           }
       });
       //トリミングシークバー
       trimmingBar = (RangeSeekBar) findViewById(R.id.trimmingSeekBar);
       trimmingBar.setRangeValues(0,duration);
       maxtimelabel = createTimeLabel(duration);
       stopTrimming.setText(maxtimelabel);
       trimmingBar.setOnRangeSeekBarChangeListener(new RangeSeekBar.OnRangeSeekBarChangeListener(){
           @Override
       ①
           public void onRangeSeekBarValuesChanged(RangeSeekBar bar, Object minValue, Object maxValue) {
               //Object型からString型に変換
               String minstr = minValue.toString();
               String maxstr = maxValue.toString();
               //String型からint型に変換
               int minint = Integer.parseInt(minstr);
               int maxint = Integer.parseInt(maxstr);
               //0:00のような表示にする
               String minlabel = createTimeLabel(minint);
               String maxlabel = createTimeLabel(maxint);
               //トリミングする開始時間と終了時間を表示する
               startTrimming.setText(minlabel);
               stopTrimming.setText(maxlabel);
           }
       });
       final Button trimmingButton = (Button) findViewById(R.id.trimmingButton);
       trimmingButton.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v) {
               //トリミング開始時間の取得
               start = trimmingBar.getSelectedMinValue();
               String min = start.toString();
               int trimstart = Integer.parseInt(min);
               String mincurrent = createTimeLabel(trimstart);
               System.out.println(mincurrent);
               //トリミング終了時間の取得
               stop = trimmingBar.getSelectedMaxValue();
               String max = stop.toString();
               int trimstop = Integer.parseInt(max);
               String maxcurrent = createTimeLabel(trimstop);
               System.out.println(maxcurrent);
               **//トリミングの作業をここで行い、ディレクトリに挿入する**
               ** //ここで処理を書き込んで処理をしたいです。**
           }
       });
   }
   private Handler handler = new Handler(){
       @Override
       public void handleMessage(Message msg) {
           int currentPosition = msg.what;
           //update position time
           VoiceseekBar.setProgress(currentPosition);
           //update position label
           String Voicetime = createTimeLabel(currentPosition);
           timeLabel.setText(Voicetime);
       }
   };
   public String createTimeLabel(int time){
       String timeLabel = "";
       int min = time / 1000 / 60;
       int sec = time / 1000 % 60;
       timeLabel = min + ":";
       if(sec < 10){
           timeLabel += "0";
       }
       timeLabel += sec;
       return timeLabel;
   }
}
```
  • Android Studio

    4895 questions

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

2 seekbarを二つ用いて使っていましたが、rangeseekbarを用いたことで、一つのseekbarで範囲を指定することができました。

slvg8122

slvg8122 score 4

2018/05/31 00:28  投稿

wavファイルのトリミング処理をしたいです。
・前提・実現したいこと
Android Studio(Java)で、音声ファイル(wav)をトリミングをするアプリを作っています。
・発生している問題点・エラーメッセージ
今現在では、RangeSeekBarを用いて、トリミングを行いたい開始時間と終了時間の取得(①)はできていますが、その指定した区間で、ボタンをクリックすることでトリミングを行うにはどのようなメソッドが必要なのかがわからないことと、そのデータをrawディレクトリ内に入れて保存する作業ができていないのが現状の問題点です。
・問題が発生するまでの流れ・手順
トリミングを行いたい開始・終了時間の取得ができて、トリミングの作業に進めるために調べていったところ
### 前提・実現したいこと
 Android Studio(Java)で、音声ファイル(wav)をトリミングをするアプリを作っています。
### 発生している問題点・エラーメッセージ
 今現在では、RangeSeekBarを用いて、トリミングを行いたい開始時間と終了時間の取得(①)はできていますが、その  指定した区間で、ボタンをクリックすることでトリミングを行うにはどのようなメソッドが必要なのかがわからないことと、
 そのデータをrawディレクトリ内に入れて保存する作業ができていないのが現状の問題点です。
### 問題が発生するまでの流れ・手順
 トリミングを行いたい開始・終了時間の取得ができて、トリミングの作業に進めるために調べていったところ
ソースコード
※()内はidです。
### ソースコード
 ※()内はidです。
```MainActivity.java
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import com.yahoo.mobile.client.android.util.rangeseekbar.RangeSeekBar;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
   MediaPlayer mediaPlayer = null;
   Button buttonStart;
   SeekBar VoiceseekBar;
   int duration;
   TextView timeLabel;
   TextView startTrimming;
   TextView stopTrimming;
   String maxtimelabel;
   RangeSeekBar trimmingBar;
   Object start;
   Object stop;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       //音声(または音楽)の再生時間を表示するTextView
       timeLabel = (TextView) findViewById(R.id.timeLabel);
       //トリミングを開始する時間を表示するTextView
       startTrimming = (TextView) findViewById(R.id.startTrimmingTime);
       //トリミングを終了する時間を表示するTextView
       stopTrimming = (TextView) findViewById(R.id.stopTrimmingTime);
       //音声ファイルを取得
       mediaPlayer = MediaPlayer.create(this,R.raw.sample01);
       mediaPlayer.seekTo(0);
       duration = mediaPlayer.getDuration();
       // 音声再生シークバー
       VoiceseekBar = (SeekBar) findViewById(R.id.voiceSeekbar);
       //VoiceseekBarの最大値設定
       VoiceseekBar.setMax(duration);
       VoiceseekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
           //ツマミがドラッグされると呼ばれる
           @Override
           public void onProgressChanged(SeekBar seekBar, int progress, boolean input) {
               if(input){
                   mediaPlayer.seekTo(progress);
                   VoiceseekBar.setProgress(progress);
               }
           }
           //ツマミがタッチされた時に呼ばれる
           @Override
           public void onStartTrackingTouch(SeekBar seekBar) {
           }
           //ツマミがリリースされた時に呼ばれる
           @Override
           public void onStopTrackingTouch(SeekBar seekBar) {
           }
       });
       //
       new Thread(new Runnable() {
           @Override
           public void run() {
               while(mediaPlayer != null){
                   try{
                       Message msg = new Message();
                       msg.what = mediaPlayer.getCurrentPosition();
                       handler.sendMessage(msg);
                       Thread.sleep(1000);
                   }catch(InterruptedException e){}
               }
           }
       }).start();
       //音声(または音楽)の再生、一時停止ボタン
       buttonStart = (Button) findViewById(R.id.start);
       buttonStart.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v) {
               //クリック時にシークバーが動く処理(ボタンクリックでseekBarを止める(シークバーで表示(音声の現在の再生位置を取得)))
               VoiceseekBar.setProgress(mediaPlayer.getCurrentPosition());
               //音声再生、一時停止処理
               if (mediaPlayer.isPlaying()) {//再生中
                   buttonStart.setText("再生");
                   mediaPlayer.stop();
                   try {
                       mediaPlayer.prepare();
                   } catch (IllegalStateException e) {
                       e.printStackTrace();
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               }
               else { //停止中
                   buttonStart.setText("一時停止");
                   mediaPlayer.start();
               }
           }
       });
       //トリミングシークバー
       trimmingBar = (RangeSeekBar) findViewById(R.id.trimmingSeekBar);
       trimmingBar.setRangeValues(0,duration);
       maxtimelabel = createTimeLabel(duration);
       stopTrimming.setText(maxtimelabel);
       trimmingBar.setOnRangeSeekBarChangeListener(new RangeSeekBar.OnRangeSeekBarChangeListener(){
           @Override
       ①
           public void onRangeSeekBarValuesChanged(RangeSeekBar bar, Object minValue, Object maxValue) {
               //Object型からString型に変換
               String minstr = minValue.toString();
               String maxstr = maxValue.toString();
               //String型からint型に変換
               int minint = Integer.parseInt(minstr);
               int maxint = Integer.parseInt(maxstr);
               //0:00のような表示にする
               String minlabel = createTimeLabel(minint);
               String maxlabel = createTimeLabel(maxint);
               //トリミングする開始時間と終了時間を表示する
               startTrimming.setText(minlabel);
               stopTrimming.setText(maxlabel);
           }
       });
       final Button trimmingButton = (Button) findViewById(R.id.trimmingButton);
       trimmingButton.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v) {
               //トリミング開始時間の取得
               start = trimmingBar.getSelectedMinValue();
               String min = start.toString();
               int trimstart = Integer.parseInt(min);
               String mincurrent = createTimeLabel(trimstart);
               System.out.println(mincurrent);
               //トリミング終了時間の取得
               stop = trimmingBar.getSelectedMaxValue();
               String max = stop.toString();
               int trimstop = Integer.parseInt(max);
               String maxcurrent = createTimeLabel(trimstop);
               System.out.println(maxcurrent);
               **//トリミングの作業をここで行い、ディレクトリに挿入する**
               ** //ここで処理を書き込んで処理をしたいです。**
           }
       });
   }
   private Handler handler = new Handler(){
       @Override
       public void handleMessage(Message msg) {
           int currentPosition = msg.what;
           //update position time
           VoiceseekBar.setProgress(currentPosition);
           //update position label
           String Voicetime = createTimeLabel(currentPosition);
           timeLabel.setText(Voicetime);
       }
   };
   public String createTimeLabel(int time){
       String timeLabel = "";
       int min = time / 1000 / 60;
       int sec = time / 1000 % 60;
       timeLabel = min + ":";
       if(sec < 10){
           timeLabel += "0";
       }
       timeLabel += sec;
       return timeLabel;
   }
}
```
  • Android Studio

    4895 questions

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

1 seekbarを二つ用いて使っていましたが、rangeseekbarを用いたことで、一つのseekbarで範囲を指定することができました。

slvg8122

slvg8122 score 4

2018/05/31 00:26  投稿

mp3の音声(または音楽)をトリミングする方法がわかりません
wavファイルのトリミング処理をしたいです。
現在、android studioを用いて、音声(または音楽)のトリミングを行いたいと考えているのですが、音声をトリミングする開始時間と終了時間の取得はできているのですが、その先にトリミングを行うにはどのようにプログラムを組んで作成するのかが分かりません。
また、参考サイトも教えていただければありがたいです。
以上、よろしくお願いいたします。
・前提・実現したいこと
Android Studio(Java)で、音声ファイル(wav)をトリミングをするアプリを作っています。
・発生している問題点・エラーメッセージ
今現在では、RangeSeekBarを用いて、トリミングを行いたい開始時間と終了時間の取得(①)はできていますが、その指定した区間で、ボタンをクリックすることでトリミングを行うにはどのようなメソッドが必要なのかがわからないことと、そのデータをrawディレクトリ内に入れて保存する作業ができていないのが現状の問題点です。
・問題が発生するまでの流れ・手順
トリミングを行いたい開始・終了時間の取得ができて、トリミングの作業に進めるために調べていったところ
・ソースコード
※()内はidです。
・音声(または音楽)を開始位置を動かすために使用する(途中再生など)「seekbar(VoiceSeekBar)」
・音声(または音楽)を再生、一時停止をするために使用するボタン「Button(start)」
・音声(または音楽)の再生時間を表示する「TextView(timeLabel)」
・音声(または音楽)のトリミングを終了する時間を調節する「seekbar(stopTrimming)」  
・音声(または音楽)をトリミングするボタン「Button(trimmingButton)」
・音声(または音楽)のトリミングを開始する時間を表示する「TextView(startTrimmingTime)」
・音声(または音楽)のトリミングを終了する時間を表示する「TextView(stopTrimmingTime)」
```MainActivity.java
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import com.yahoo.mobile.client.android.util.rangeseekbar.RangeSeekBar;  
 
import java.io.IOException;
public class MainActivity extends AppCompatActivity{
public class MainActivity extends AppCompatActivity {
   MediaPlayer mediaPlayer = null;
   Button buttonStart;
   SeekBar VoiceseekBar;
   int duration;
   TextView timeLabel;
   TextView startTrimming;
   TextView stopTrimming;
   int start;
   int stop;
   String maxtimelabel;
   RangeSeekBar trimmingBar;
   Object start;
   Object stop;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
 
       //音声(または音楽)の再生時間を表示するTextView
       timeLabel = (TextView) findViewById(R.id.timeLabel);
       //トリミングを開始する時間を表示するTextView
       startTrimming = (TextView) findViewById(R.id.startTrimmingTime);
       //トリミングを終了する時間を表示するTextView
       stopTrimming = (TextView) findViewById(R.id.stopTrimmingTime);
       //音声ファイルを取得
       mediaPlayer = MediaPlayer.create(this,R.raw.music);
       mediaPlayer = MediaPlayer.create(this,R.raw.sample01);
       mediaPlayer.seekTo(0);
       duration = mediaPlayer.getDuration();
       // 音声再生シークバー
       VoiceseekBar = (SeekBar) findViewById(R.id.voiceSeekbar);
       //VoiceseekBarの最大値設定
       VoiceseekBar.setMax(duration);
       VoiceseekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
           //ツマミがドラッグされると呼ばれる
           @Override
           public void onProgressChanged(SeekBar seekBar, int progress, boolean input) {
               if(input){
                   mediaPlayer.seekTo(progress);
                   VoiceseekBar.setProgress(progress);
               }
           }
           //ツマミがタッチされた時に呼ばれる
           @Override
           public void onStartTrackingTouch(SeekBar seekBar) {
           }
           //ツマミがリリースされた時に呼ばれる
           @Override
           public void onStopTrackingTouch(SeekBar seekBar) {
           }
       });
       //
       new Thread(new Runnable() {
           @Override
           public void run() {
               while(mediaPlayer != null){
                   try{
                       Message msg = new Message();
                       msg.what = mediaPlayer.getCurrentPosition();
                       handler.sendMessage(msg);
                       Thread.sleep(1000);
                   }catch(InterruptedException e){}
               }
           }
       }).start();
       //音声(または音楽)の再生、一時停止ボタン
       buttonStart = (Button) findViewById(R.id.start);
       buttonStart.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v) {
               //クリック時にシークバーが動く処理(ボタンクリックでseekBarを止める(シークバーで表示(音声の現在の再生位置を取得)))
               VoiceseekBar.setProgress(mediaPlayer.getCurrentPosition());
               //音声再生、一時停止処理
               if (mediaPlayer.isPlaying()) {//再生中
                   buttonStart.setText("再生");
                   mediaPlayer.stop();
                   try {
                       mediaPlayer.prepare();
                   } catch (IllegalStateException e) {
                       e.printStackTrace();
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               }
               else { //停止中
                   buttonStart.setText("一時停止");
                   mediaPlayer.start();
               }
           }
       });
       //トリミング作業//
       final SeekBar startseekBar = (SeekBar) findViewById(R.id.startTrimming);
       startseekBar.setMax(duration);
       final SeekBar stopseekBar = (SeekBar) findViewById(R.id.stopTrimming);
       stopseekBar.setMax(duration);
       Button trimmingButton = (Button) findViewById(R.id.trimmingButton);
       //トリミング開始部分//
       startseekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
           @Override
           public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
               //stopseekBarよりも先に行かないようにする
               if(startseekBar.getProgress() >= stopseekBar.getProgress()){
                   startseekBar.setProgress(stopseekBar.getProgress());
               }else{
                   String trimmingTime = createTimeLabel(progress);
                   startTrimming.setText(trimmingTime);
               }
           }
           @Override
           public void onStartTrackingTouch(SeekBar seekBar) {
           }
           @Override
           public void onStopTrackingTouch(SeekBar seekBar) {
           }
       });
       //トリミング終了部分//
       stopseekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
           @Override
           public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
               //startseekBarのsecondaryProgressをstopseekBarの上限まで入れる//
               startseekBar.setSecondaryProgress(stopseekBar.getProgress());
               //stopseekBarを動かしている時に止まっているstartseekBarをstopseekBar以下の値にしておく
               if(stopseekBar.getProgress() <= startseekBar.getProgress()){
                   startseekBar.setProgress(stopseekBar.getProgress());
               }
               String trimmingTime = createTimeLabel(progress);
               stopTrimming.setText(trimmingTime);
           }
           @Override
           public void onStartTrackingTouch(SeekBar seekBar) {
           }
           @Override
           public void onStopTrackingTouch(SeekBar seekBar) {
           }
       });
       //指定範囲をトリミングするボタン
       //トリミングシークバー
       trimmingBar = (RangeSeekBar) findViewById(R.id.trimmingSeekBar);
       trimmingBar.setRangeValues(0,duration);
       maxtimelabel = createTimeLabel(duration);
       stopTrimming.setText(maxtimelabel);
       trimmingBar.setOnRangeSeekBarChangeListener(new RangeSeekBar.OnRangeSeekBarChangeListener(){
           @Override
       ①
           public void onRangeSeekBarValuesChanged(RangeSeekBar bar, Object minValue, Object maxValue) {
               //Object型からString型に変換
               String minstr = minValue.toString();
               String maxstr = maxValue.toString();
               //String型からint型に変換
               int minint = Integer.parseInt(minstr);
               int maxint = Integer.parseInt(maxstr);
               //0:00のような表示にする
               String minlabel = createTimeLabel(minint);
               String maxlabel = createTimeLabel(maxint);
               //トリミングする開始時間と終了時間を表示する
               startTrimming.setText(minlabel);
               stopTrimming.setText(maxlabel);
           }
       });
       final Button trimmingButton = (Button) findViewById(R.id.trimmingButton);
       trimmingButton.setOnClickListener(new View.OnClickListener(){
           @Override
           public void onClick(View v) {
               //トリミングの開始時間を取得
               start = startseekBar.getProgress();
               //トリミングの終了時間を取得
               stop = stopseekBar.getProgress();
          //**ここでトリミングを行いたいです**
               //トリミング開始時間の取得
               start = trimmingBar.getSelectedMinValue();
               String min = start.toString();
               int trimstart = Integer.parseInt(min);
               String mincurrent = createTimeLabel(trimstart);
               System.out.println(mincurrent);
               //トリミング終了時間の取得
               stop = trimmingBar.getSelectedMaxValue();
               String max = stop.toString();
               int trimstop = Integer.parseInt(max);
               String maxcurrent = createTimeLabel(trimstop);
               System.out.println(maxcurrent);
               **//トリミングの作業をここで行い、ディレクトリに挿入する**
               ** //ここで処理を書き込んで処理をしたいです。**
           }
       });
   }
   private Handler handler = new Handler(){
       @Override
       public void handleMessage(Message msg) {
           int currentPosition = msg.what;
           //update position time
           VoiceseekBar.setProgress(currentPosition);
           //update position label
           String Voicetime = createTimeLabel(currentPosition);
           timeLabel.setText(Voicetime);
       }
   };
   public String createTimeLabel(int time){
       String timeLabel = "";
       int min = time / 1000 / 60;
       int sec = time / 1000 % 60;
       timeLabel = min + ":";
       if(sec < 10){
           timeLabel += "0";
       }
       timeLabel += sec;
       return timeLabel;
   }
 
}
 
```
  • Android Studio

    4895 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る