用vb6.0做与电视同步的播放器器怎么实现随机播放和歌词同步

用VB制作一个简单的MP3播放器_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
用VB制作一个简单的MP3播放器
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢3083人阅读
做项目,用到显示歌词,现在一般听歌MP3是最普遍的,歌词文件就是对应的lrc文件,有的MP3文件包含歌词,但说实话还真没碰到,我就是在播放MP3文件时收索对应的lrc文件,然后把歌词读出来,分离处时间标签和歌词,根据时间标签来显示歌词,我用到的directshow接口播放的音视频,能够获得当前进度,转化成秒和时间标签对比,如果相等就把那行歌词显示出来,读取歌词是按行读取的,歌词文件和MP3文件放在一个目录下,当播放某个MP3文件时,只需把MP3文件的后缀换成lrc,找到歌词文件就读取,其中要注意歌词文件名要和MP3文件同名才行,读取lrc就要按lrc文件的标准读取,其中涉及时间标签补偿,空行等细节,读取要考虑很多,有空会说一下,具体怎样读取显示。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:80974次
积分:1276
积分:1276
排名:千里之外
原创:42篇
转载:13篇
评论:17条
(2)(4)(2)(1)(3)(5)(3)(7)(8)(4)(3)(9)(2)(1)(1)Android实现歌曲播放时歌词同步显示具体思路
字体:[ ] 类型:转载 时间:
歌曲播放时歌词同步显示,我们需要读取以上歌词文件的每一行转换成成一个个歌词实体,可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词
我们需要读取以上歌词文件的每一行转换成成一个个歌词实体:
代码如下: public class LyricObject {
// 开始时间
// 结束时间
// 单句歌词用时 public S // 单句歌词 }
可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词。在UI线程中另起线程,通过回调函数 onDraw() 每隔100ms重新绘制屏幕,实现歌词平滑滚动的动画效果。MainActivity代码如下:
代码如下: import java.io.IOE import android.app.A import android.media.MediaP import android.net.U import android.os.B import android.os.E import android.os.H import android.view.V import android.view.View.OnClickL import android.widget.B import android.widget.SeekB import android.widget.SeekBar.OnSeekBarChangeL public class MainActivity extends Activity { /** Called when the activity is first created. */ private LyricView lyricV private MediaPlayer mediaP private B private SeekBar seekB private String mp3P 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 = mp3P 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(); // 更新视图 } }; }
歌词View的代码如下:
代码如下: import java.io.BufferedR import java.io.F import java.io.FileInputS import java.io.FileNotFoundE import java.io.IOE import java.io.InputStreamR import java.util.I import java.util.TreeM import java.util.regex.M import java.util.regex.P import android.content.C import android.graphics.C import android.graphics.C import android.graphics.P import android.util.AttributeS import android.util.L import android.view.MotionE import android.view.V public class LyricView extends View{ private static TreeMap&Integer, LyricObject& lrc_ private float mX; //屏幕X轴的中点,此值固定,保持歌词在X中间显示 private float offsetY; //歌词在Y轴上的偏移量,此值会根据歌词的滚动变小 private static boolean blLrc= private float touchY; //当触摸歌词View时,保存为当前触点的Y轴坐标 private float touchX; private boolean blScrollView= private int lrcIndex=0; //保存歌词TreeMap的下标 private int SIZEWORD=0;//显示歌词文字的大小值 private int INTERVAL=45;//歌词每行的间隔 Paint paint=new Paint();//画笔,用于画不是高亮的歌词 Paint paintHL=new Paint(); //画笔,用于画高亮的歌词,即当前唱到这句歌词 public LyricView(Context context){ super(context); init(); } public LyricView(Context context, AttributeSet attrs) { super(context, attrs); init(); } /* (non-Javadoc) * @see android.view.View#onDraw(android.graphics.Canvas) */ @Override protected void onDraw(Canvas canvas) { if(blLrc){ paintHL.setTextSize(SIZEWORD); paint.setTextSize(SIZEWORD); LyricObject temp=lrc_map.get(lrcIndex); canvas.drawText(temp.lrc, mX, offsetY+(SIZEWORD+INTERVAL)*lrcIndex, paintHL); // 画当前歌词之前的歌词 for(int i=lrcIndex-1;i&=0;i--){ temp=lrc_map.get(i); if(offsetY+(SIZEWORD+INTERVAL)*i&0){
} canvas.drawText(temp.lrc, mX, offsetY+(SIZEWORD+INTERVAL)*i, paint); } // 画当前歌词之后的歌词 for(int i=lrcIndex+1;i&lrc_map.size();i++){ temp=lrc_map.get(i); if(offsetY+(SIZEWORD+INTERVAL)*i&600){
} canvas.drawText(temp.lrc, mX, offsetY+(SIZEWORD+INTERVAL)*i, paint); } } else{ paint.setTextSize(25); canvas.drawText("找不到歌词", mX, 310, paint); } super.onDraw(canvas); } /* (non-Javadoc) * @see android.view.View#onTouchEvent(android.view.MotionEvent) */ @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub System.out.println("bllll==="+blScrollView); float tt=event.getY(); if(!blLrc){ //return super.onTouchEvent(event); return super.onTouchEvent(event); } switch(event.getAction()){ case MotionEvent.ACTION_DOWN: touchX=event.getX();
case MotionEvent.ACTION_MOVE: touchY=tt-touchY; offsetY=offsetY+touchY;
case MotionEvent.ACTION_UP: blScrollView=
} public void init(){ lrc_map = new TreeMap&Integer, LyricObject&(); offsetY=320; paint=new Paint(); paint.setTextAlign(Paint.Align.CENTER); paint.setColor(Color.GREEN); paint.setAntiAlias(true); paint.setDither(true); paint.setAlpha(180); paintHL=new Paint(); paintHL.setTextAlign(Paint.Align.CENTER); paintHL.setColor(Color.RED); paintHL.setAntiAlias(true); paintHL.setAlpha(255); } /** * 根据歌词里面最长的那句来确定歌词字体的大小 */ public void SetTextSize(){ if(!blLrc){
} int max=lrc_map.get(0).lrc.length(); for(int i=1;i&lrc_map.size();i++){ LyricObject lrcStrLength=lrc_map.get(i); if(max&lrcStrLength.lrc.length()){ max=lrcStrLength.lrc.length(); } } SIZEWORD=320/ } protected void onSizeChanged(int w, int h, int oldw, int oldh) { mX = w * 0.5f; super.onSizeChanged(w, h, oldw, oldh); } /** * 歌词滚动的速度 * * @return 返回歌词滚动的速度 */ public Float SpeedLrc(){ float speed=0; if(offsetY+(SIZEWORD+INTERVAL)*lrcIndex&220){ speed=((offsetY+(SIZEWORD+INTERVAL)*lrcIndex-220)/20); } else if(offsetY+(SIZEWORD+INTERVAL)*lrcIndex & 120){ Log.i("speed", "speed is too fast!!!"); speed = 0; } // if(speed&0.2){ // speed=0.2f; // }
} /** * 按当前的歌曲的播放时间,从歌词里面获得那一句 * @param time 当前歌曲的播放时间 * @return 返回当前歌词的索引值 */ public int SelectIndex(int time){ if(!blLrc){ return 0; } int index=0; for(int i=0;i&lrc_map.size();i++){ LyricObject temp=lrc_map.get(i); if(temp.begintime&time){ ++ } } lrcIndex=index-1; if(lrcIndex&0){ lrcIndex=0; } return lrcI } /** * 读取歌词文件 * @param file 歌词的路径 * */ public static void read(String file) { TreeMap&Integer, LyricObject& lrc_read =new TreeMap&Integer, LyricObject&(); String data = ""; try { File saveFile=new File(file); // System.out.println("是否有歌词文件"+saveFile.isFile()); if(!saveFile.isFile()){ blLrc=
} blLrc= //System.out.println("bllrc==="+blLrc); FileInputStream stream = new FileInputStream(saveFile);// context.openFileInput(file); BufferedReader br = new BufferedReader(new InputStreamReader(stream,"GB2312")); int i = 0; Pattern pattern = pile("\\d{2}"); while ((data = br.readLine()) != null) { // System.out.println("++++++++++++&&"+data); data = data.replace("[","");//将前面的替换成后面的 data = data.replace("]","@"); String splitdata[] =data.split("@");//分隔 if(data.endsWith("@")){ for(int k=0;k&splitdata.k++){ String str=splitdata[k]; str = str.replace(":","."); str = str.replace(".","@"); String timedata[] =str.split("@"); Matcher matcher = pattern.matcher(timedata[0]); if(timedata.length==3 && matcher.matches()){ int m = Integer.parseInt(timedata[0]); //分 int s = Integer.parseInt(timedata[1]); //秒 int ms = Integer.parseInt(timedata[2]); //毫秒 int currTime = (m*60+s)*1000+ms*10; LyricObject item1= new LyricObject(); item1.begintime = currT item1.lrc = ""; lrc_read.put(currTime,item1); } } } else{ String lrcContenet = splitdata[splitdata.length-1]; for (int j=0;j&splitdata.length-1;j++) { String tmpstr = splitdata[j]; tmpstr = tmpstr.replace(":","."); tmpstr = tmpstr.replace(".","@"); String timedata[] =tmpstr.split("@"); Matcher matcher = pattern.matcher(timedata[0]); if(timedata.length==3 && matcher.matches()){ int m = Integer.parseInt(timedata[0]); //分 int s = Integer.parseInt(timedata[1]); //秒 int ms = Integer.parseInt(timedata[2]); //毫秒 int currTime = (m*60+s)*1000+ms*10; LyricObject item1= new LyricObject(); item1.begintime = currT item1.lrc = lrcC lrc_read.put(currTime,item1);// 将currTime当标签 item1当数据 插入TreeMap里 i++; } } } } stream.close(); } catch (FileNotFoundException e) { } catch (IOException e) { } /* * 遍历hashmap 计算每句歌词所需要的时间 */ lrc_map.clear(); data =""; Iterator&Integer& iterator = lrc_read.keySet().iterator(); LyricObject oldval = int i =0; while(iterator.hasNext()) { Object ob =iterator.next(); LyricObject val = (LyricObject)lrc_read.get(ob); if (oldval==null) oldval = else { LyricObject item1= new LyricObject(); item1 = item1.timeline = val.begintime-oldval. lrc_map.put(new Integer(i), item1); i++; oldval = } if (!iterator.hasNext()) { lrc_map.put(new Integer(i), val); } } } /** * @return the blLrc */ public static boolean isBlLrc() { return blL } /** * @return the offsetY */ public float getOffsetY() { return offsetY; } /** * @param offsetY the offsetY to set */ public void setOffsetY(float offsetY) { this.offsetY = offsetY; } /** * @return 返回歌词文字的大小 */ public int getSIZEWORD() { return SIZEWORD; } /** * 设置歌词文字的大小 * @param sIZEWORD the sIZEWORD to set */ public void setSIZEWORD(int sIZEWORD) { SIZEWORD = sIZEWORD; } }
xml布局文件如下:
代码如下: &SPAN style="FONT-SIZE: 18px"&&STRONG&&?xml version="1.0" encoding="utf-8"?& &RelativeLayout xmlns:android="/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#FFFFFF" & &com.music.lyricsync.LyricView android:id="@+id/mylrc" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginBottom="50dip" android:layout_marginTop="50dip" /& &LinearLayout xmlns:android="/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" & &Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" /& &SeekBar android:id="@+id/seekbarmusic" android:layout_width="205px" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginBottom="5px" android:progress="0" /& &/LinearLayout& &/RelativeLayout& &/STRONG&&/SPAN&
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具| Copyright &
. All Rights Reserved .&>&&>&&>&&>&VB/VBA实现PPT中同步歌词播放
VB/VBA实现PPT中同步歌词播放
上传大小:314KB
VB中实现对Lrc歌词的完美解析,并应用于PPT中VBA代码的自动生成,使PPT能同步播放歌词。完全原创。
综合评分:4(2位用户评分)
所需积分:5
下载次数:19
审核通过送C币
创建者:caozhy
创建者:sysdzw
创建者:sysdzw
课程推荐相关知识库
上传者其他资源上传者专辑
开发技术热门标签
VIP会员动态
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
VB/VBA实现PPT中同步歌词播放
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:}

我要回帖

更多关于 与电视同步的播放器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信