永发信息网

android 如何实现 边录音 同时显示 歌词评分?有原理,代码就好了。。

答案:3  悬赏:0  手机版
解决时间 2021-04-06 12:45
android 如何实现 边录音 同时显示 歌词评分?有原理,代码就好了。。
最佳答案
歌曲播放时歌词同步显示,我们需要读取以上歌词文件的每一行转换成成一个个歌词实体,可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词
  我们需要读取以上歌词文件的每一行转换成成一个个歌词实体:
   代码如下:

  public class LyricObject {
  public int begintime; // 开始时间
  public int endtime; // 结束时间
  public int timeline; // 单句歌词用时
  public String lrc; // 单句歌词
  }

  可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词。在UI线程中另起线程,通过回调函数 onDraw() 每隔100ms重新绘制屏幕,实现歌词平滑滚动的动画效果。MainActivity代码如下:
   代码如下:

  import java.io.IOException;
  import android.app.Activity;
  import android.media.MediaPlayer;
  import android.net.Uri;
  import android.os.Bundle;
  import android.os.Environment;
  import android.os.Handler;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.SeekBar;
  import android.widget.SeekBar.OnSeekBarChangeListener;
  public class MainActivity extends Activity {
  
  private LyricView lyricView;
  private MediaPlayer mediaPlayer;
  private Button button;
  private SeekBar seekBar;
  private String mp3Path;
  private int INTERVAL=45;//歌词每行的间隔
  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
  setContentView(R.layout.main);
  mp3Path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/LyricSync/1.mp3";
  lyricView = (LyricView) findViewById(R.id.mylrc);
  mediaPlayer = new MediaPlayer();
  // this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  ResetMusic(mp3Path);
  SerchLrc();
  lyricView.SetTextSize();
  button = (Button) findViewById(R.id.button);
  button.setText("播放");
  seekBar = (SeekBar) findViewById(R.id.seekbarmusic);
  seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
  @Override
  public void onStopTrackingTouch(SeekBar seekBar) {
  // TODO Auto-generated method stub
  }
  @Override
  public void onStartTrackingTouch(SeekBar seekBar) {
  // TODO Auto-generated method stub
  }
  @Override
  public void onProgressChanged(SeekBar seekBar, int progress,
  boolean fromUser) {
  // TODO Auto-generated method stub
  if (fromUser) {
  mediaPlayer.seekTo(progress);
  lyricView.setOffsetY(220 - lyricView.SelectIndex(progress)
  * (lyricView.getSIZEWORd() + INTERVAL-1));
  }
  }
  });
  button.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  // TODO Auto-generated method stub
  if (mediaPlayer.isPlaying()) {
  button.setText("播放");
  mediaPlayer.pause();
  } else {
  button.setText("暂停");
  mediaPlayer.start();
  lyricView.setOffsetY(220 - lyricView.SelectIndex(mediaPlayer.getCurrentPosition())
  * (lyricView.getSIZEWORd() + INTERVAL-1));
  }
  }
  });
  mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
  @Override
  public void onCompletion(MediaPlayer mp) {
  ResetMusic(mp3Path);
  lyricView.SetTextSize();
  lyricView.setOffsetY(200);
  mediaPlayer.start();
  }
  });
  seekBar.setMax(mediaPlayer.getDuration());
  new Thread(new runable()).start();
  }
  public void SerchLrc() {
  String lrc = mp3Path;
  lrc = lrc.substring(0, lrc.length() - 4).trim() + ".lrc".trim();
  LyricView.read(lrc);
  lyricView.SetTextSize();
  lyricView.setOffsetY(350);
  }
  public void ResetMusic(String path) {
  mediaPlayer.reset();
  try {
  mediaPlayer.setDataSource(mp3Path);
  mediaPlayer.prepare();
  } catch (IllegalArgumentException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  } catch (IllegalStateException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  }
  class runable implements Runnable {
  @Override
  public void run() {
  // TODO Auto-generated method stub
  while (true) {
  try {
  Thread.sleep(100);
  if (mediaPlayer.isPlaying()) {
  lyricView.setOffsetY(lyricView.getOffsetY() - lyricView.SpeedLrc());
  lyricView.SelectIndex(mediaPlayer.getCurrentPosition());
  seekBar.setProgress(mediaPlayer.getCurrentPosition());
  mHandler.post(mUpdateResults);
  }
  } catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  }
  }
  }
  Handler mHandler = new Handler();
  Runnable mUpdateResults = new Runnable() {
  public void run() {
  lyricView.invalidate(); // 更新视图
  }
  };
  }
全部回答
这没办法
歌曲播放时歌词同步显示,我们需要读取以上歌词文件的每一行转换成成一个个歌词实体,可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词   我们需要读取以上歌词文件的每一行转换成成一个个歌词实体:    代码如下:   public class lyricobject {   public int begintime; // 开始时间   public int endtime; // 结束时间   public int timeline; // 单句歌词用时   public string lrc; // 单句歌词   }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
求助高手,EXCEL里一复制或者剪切就卡死,重
寂静的夜晚里心情语录,以声写静,更显夜的寂
四运集团八车队地址在哪,我要去那里办事
“籍贯”和“原籍”以及“出生地”三者意思相
有关南极地区的叙述,正确的是
石昊和月婵后几百集在不在一起,月婵对他有点
它是谁?叫什么神奇宝贝
Whenareyou________forBeijing?A.left
谁推介我一部类似那些年我们一起追过的女孩那
最好的留言
求邵阳自考办电话,,要能打通,,不求复制
王者荣耀版告白情话,王者荣耀里说的话
我这个是什么BIOS啊?怎么启动选项优先权只有
下列有关曲霉的说法正确的是A.它的菌丝没有横
付家山地址在什么地方,想过去办事
推荐资讯
彭烨我爱你
希望 HOT 歌词
新闻出版解放公园小区在哪里啊,我有事要去这
找10首lady gaga的最出名的歌
下列各句中,没有语病、句意明确的一项是A.在
世上真有“深蓝孩童”吗
高三了 真的好想死!
在人和动物体内的胰岛素是一种含有两条肽链的
I can still remember the first day when i
益阳市有几个收费站?收费站的别名是什么?
红外遥控器载波频率有哪几种?
如何使文笔流畅
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?