精华内容
下载资源
问答
  • 音乐播放
    千次阅读
    2019-07-26 21:31:27

    Web音乐播放

    最近做了个音乐播放的功能模块,只要给标签添加一个src读取项目里的音乐文件就能进行播放,如
    loop:循环播放;
    autoplay:打开页面自动播放;
    controls=“controls” 向用户显示控件,比如播放按钮。
    【1】简易的音乐播放

    当然项目不可能做得那么简陋,我的目标是模仿网易云播放器

    这是html5标签原生的样式有点丑,也不符合要求,只能自己去手写
    在这里插入图片描述
    【2】手写音乐播放样式

     <style type="text/css">
    	.slider_box {
    	 	position:absolute;
    	    width: 100%;
    	    background-color:#2e2e2e;
    	    height: 80px;
    	    box-shadow: 1px 1px 2px 2px #808080;
    	    bottom:10px;
    	    z-index: 10;
    	 }
    	 .slidearea {
    	    position:absolute;
    	    width: 800px;
    	    left:340px;
    	    top:50px;
    	         
    	  }
        .fa_controls{
          position:absolute;
          left:90px;
    	  top:15px;
        }
        .fa_controls a{
         padding:10px 15px;
        }
       .fa_controls .fa{
        font-size: 30px;
        color: #fff;
     
        }
        #pauseone i,#playing i{
           font-size: 45px;
        }
        .fa_controls .fa:hover{
         text-shadow:0px 1px 2px  #fff;
         
        }
        .musicinfor{
          position:absolute;
    	  left:370px;
    	  top:20px;
    	  color: #fff;
    	  font-size: 15px;
        }
        .musicTime{
        position:absolute;
    	  left:1180px;
          top: 55px;
          color: #fff;
        }
        .volumeControl{
         position:absolute;
    	  left:1340px;
          top: 25px;
          
        }
         .volumeControl .fa{
        font-size: 27px;
        color: #fff;
         
        }
        .volumeSlide{
         position:absolute;
    	  left:1380px;
          top: 35px;
        }
     .stateControl a{
        position:absolute;
    	left:1290px;
        top: 25px;
        font-size: 27px;
        color: #fff;
     }
    
    	.slidearea {
          -moz-transition: all 0s;
          -o-transition: all 0s;
          -webkit-transition: all 0s;
          transition: all 0s;
    	 }
    	   .dis_none{
    	     display: none;
    	   }  
    	//滑块
         input[type=range]{ 
    		 margin-top: 8px;
    	     outline: none; 
    		 -webkit-appearance: none;/*清除系统默认样式*/  
    		 width:100% !important;  
    		 background: -webkit-linear-gradient(#61bd12, #61bd12) no-repeat, #ddd;  
    	     background-size: 30% 100%;/*设置左右宽度比例*/  
    		height: 3px;/*横条的高度*/  
       } 
     /*拖动块的样式*/  
       input[type=range]::-webkit-slider-thumb {  
    	-webkit-appearance: none;/*清除系统默认样式*/  
    	height:16px;/*拖动块高度*/  
        width: 16px;/*拖动块宽度*/  
        background: #fff;/*拖动块背景*/  
    	border-radius: 50%; /*外观设置为圆形*/  
    	border: solid 1px #ddd; /*设置边框*/  
       }
       
    </style>  
    ----------------------------------------------------------------------         
         <div class="slider_box">
    			   <div class="fa_controls">
    				   <a id="lastone" href="javascript:;" >
    				     <i class="fa fa-step-backward"></i>
    				   </a>
    				   <a id="pauseone" href="javascript:;" class="" >
    				     <i class="fa fa-play-circle-o"></i>
    				   </a>
    				   <a id="playing" href="javascript:;" class="dis_none" >
    				     <i class="fa fa-pause"></i>
    				   </a>
    				   <a id="nextone" href="javascript:;">
    				     <i class="fa fa-step-forward"></i>
    				   </a>
    			   </div>
    			   <div class="musicinfor">
    			      <label id="musicinfor">蓝七七 - 侧脸</label>
    			   </div>
    			   <div class="musicTime">
    			      <label id="musicCurrentTime"></label>
    			      <label id="musicTime">/</label>
    			      <label id="musicDuration"></label>
    			   </div>
    			   <div class="slidearea">
    			    <input type="range" name="range_speed" id="range_speed" value="0" oninput="changeSpeed()" />
                   </div> 
                   <div class="volumeSlide">
                   <div id="volumeSlide" style="width:150px;"></div>
                   </div> 
    			   <div class="volumeControl">
    			      <a id="volumeUp" href="javascript:;" class="">
    				     <i class="fa fa-volume-up"></i>
    				   </a>
    				    <a id="volumeOff" href="javascript:;" class="dis_none">
    				     <i class="fa fa-volume-off"></i>
    				   </a>
    			   </div> 
    			   <div class="stateControl">
    			   
    				<!----列表循环播放----> 
    			   <a id="retweet" href="javascript:;" onclick="stateControlchange()" title="顺序播放">
    				     <i class="fa fa-retweet"></i>
    			   </a>
    			   <!----单曲循环播放----> 
    			   <a id="refresh" href="javascript:;" onclick="stateControlchange()" class="dis_none" title="单曲循环">
    				   <i class="fa fa-refresh"></i>
    				</a>
    			    <!----随机播放----> 
    			    <a id="random" href="javascript:;" onclick="stateControlchange()" class="dis_none" title="随机播放">
    				     <i class="fa fa-random"></i>
    				</a>
    				<!----顺序播放---->
    			    <a id="" href="javascript:;" onclick="stateControlchange()" class="dis_none" title="顺序播放">
    				     <i class="fa fa-exchange"></i>
    				</a>	   
    			  </div>
    			</div> 
    

    这个样式虽然也不是很漂亮,最起码比原生的好多了
    在这里插入图片描述
    【3】功能实现
    这个功能该怎么实现呢?
    首先我的进度条要随着音乐播放而滑动,可以通过html5标签的内置封装好的事件和属性实现(总体思想就是将html5标签的数据复制到我播放器里)
    对象属性:
    currentTime 获取当前播放时间
    duration 获取歌曲的总时间
    play 是否在播放 返回true/false
    pause 是否暂停 返回true/false
    对象方法:
    play() 播放歌曲
    pause() 暂停歌曲
    load()重新加载歌曲

     //音乐进度条-获取audio的播放时间比例改变进度条
          function changeSpeed() {
    		var value = $('#range_speed').val();
    		var valStr = value + "% 100%";
    		$('#range_speed').css({
    		  "background-size": valStr
    		});
    		 progressBar.value=parseInt(value);
             myCurrentTime.value=progressBar.value/100*music.duration;
             music.currentTime=myCurrentTime.value;     
    	};
    	//鼠标监听事件--通过鼠标事件进行滑动音乐进度条
    	function mouEvent(){
    		  var range_speed=document.getElementById("range_speed");
    		 //鼠标按下事件
    		range_speed.addEventListener('mousedown',function(){ 
    		     clearInterval(settime);
    	     	  $.ajaxSettings.async = false;
    	     	 move=true;
    	     	 music.pause();
    		},false);
    		//鼠标移动事件
    		range_speed.addEventListener('mousemove',function(){ 
    			if(move==true){
    			changeSpeed();
    			}
    		},false);
    		//鼠标松开事件
    		document.addEventListener('mouseup',function(){ 
    			if(move==true){
         			 move=false;
         			  var playing=document.getElementById("playing");
         			  if(playing.className==""){
         				  music.play();
         			  }
             		 SetTime(); 
         		}
    		},false);
    	}
    	 //鼠标按下事件
         $("#range_speed").on('mousedown', function (event) {
          	mouEvent();
         });
        //鼠标移动事件
        $("#range_speed").on('mousemove', function (event) {	
          	mouEvent();
         });
        //鼠标松开事件
        $(document).on("mouseup", function (event) {
          mouEvent();
        });
             
        	//进度条自动随音乐滑动
           function SetTime(){
        	  settime=setInterval(function() {
         	  myCurrentTime.value=music.currentTime;
         	  var nums= myCurrentTime.value/music.duration*100;
         		 if(isNaN(parseInt(nums))){
         			nums=0;
        	   	  }
    	        progressBar.value=nums;
    	        $("#range_speed").val(nums);
    	     	 var valStr = nums + "% 100%";
    		    $('#range_speed').css({
    		    "background-size": valStr
    		  });
    	  
           }, 1000);
        }
          //音乐播放时间改变
       	 function sumTime(){
           	 setInterval(function() {
         		 var currentTime=music.currentTime;
         		 var duration=music.duration;
       	    if(isNaN(parseInt(music.duration))){
       		 duration=0;
       	    }
         		 timeChange(currentTime, "musicCurrentTime");
         		 timeChange(duration, "musicDuration");
                }, 1000);
            }
       	//播放时间格式转换
       	    function timeChange(time, timePlace) {
       //默认获取的时间是时间戳改成我们常见的时间格式
       	        var timePlace = document.getElementById(timePlace);
       	        //分钟
       	        var minute = time / 60;
       	        var minutes = parseInt(minute);
       	        if (minutes < 10) {
       	            minutes = "0" + minutes;
       	        }
       	        //秒
       	        var second = time % 60;
       	        seconds = parseInt(second);
       	        if (seconds < 10) {
       	            seconds = "0" + seconds;
       	        }
       	        var allTime = "" + minutes + "" + ":" + "" + seconds + ""
       	        timePlace.textContent = allTime;
       	    } 
    

    【4】其他
    这个播放器的音量控件我是用layui的滑块的原理一样,自行参悟吧
    注意音乐播放器虽然能读取项目里的音频文件,但不能直接读取本地硬盘的音频文件,我是通过后台读取音频文件,再通过流输出到页面进行播放的

    //播放音乐
      public void playingMusic(HttpServletRequest request, HttpServletResponse response) throws IOException {
    	    request.setCharacterEncoding("utf-8");
    	  	response.setCharacterEncoding("utf-8");
    	    response.setContentType("text/html;charset=UTF-8");//处理响应编码
    	String range = request.getHeader("Range");
    	String fileUrl=request.getParameter("fileUrl");
    	String type=request.getParameter("type");
    	if("audio".equals(type)){
    		int musicRecordID=Integer.parseInt(request.getParameter("musicRecordID"));
    		int flag=imrs.update(musicRecordID);
    		if(flag!=1){
    			return;
    		}
    	}
    		ServletOutputStream out=null;
    		BufferedInputStream bfis=null;
    		BufferedOutputStream bfos=null;
    		try {
    		 File file=new File(fileUrl);
    		if(file.exists()){
    	      if(file.isFile()){
    	      out = response.getOutputStream();
    	      bfis=new BufferedInputStream(new FileInputStream(fileUrl));
    		  long length = file.length();
    	    	 // 播放进度 
    	    	  int count = 0; 
    	    	 // 播放百分比 
    	    	 int percent = (int)(length * 1); 
    	    	 String[] rs = range.split("\\="); 
    	    	 range = rs[1].split("\\-")[0]; 
    	   response.addHeader("Accept-Ranges", "bytes"); 
    	   response.addHeader("Content-Length", length + ""); 
    	   response.addHeader("Content-Range", "bytes " + 0 + "-" + (length - 1) + "/" + length);
    	    	 String mineType=this.getServletContext().getMimeType(file.getName());
    	    	 response.addHeader("Content-Type", mineType+";charset=UTF-8"); 
    	    	  bfos=new BufferedOutputStream(out);
    	    	  byte[] bytes=new byte[1024];
    	    	  int len=0;
    	    	  while((len=bfis.read(bytes))!=-1){
    	    		 bfos.write(bytes, 0, len);
    	    		 count += len; 
    	    		 if(count >= percent){ 
    	    		 break; 
    	    		 } 
    	    	  } 
    	      }
    		}
    		}catch (IOException e) {e.printStackTrace();}
    		  //关闭资源
    		  finally{
    		     if(bfis!=null){
    					  try {bfis.close(); } catch (IOException e) {
    					new RuntimeException("读取缓冲区关闭失败!!");}
    				   }
    			   if(bfos!=null){ try {bfos.close();} catch (IOException e) {
    				new RuntimeException("写入缓冲区关闭失败!!");}
    			   }
    			   if(out!=null){
    				   try {out.close();} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			  }
    		  }
    	  }
    
    更多相关内容
  • HTML页面音乐播放代码

    2013-04-11 14:32:20
    基于HTML页面的音乐播放代码,用JS加载也行,也可以用flash,而且比单纯的代码加载要快的多。
  • 学校电脑智能音乐播放系统自带的定时编辑软件
  • EGE基础:音乐播放

    千次阅读 多人点赞 2020-02-17 00:02:34
    EGE 如何进行音乐播放及相关操作

    EGE专栏:EGE专栏

    音乐播放

    一、winmm.lib 库的链接检查

      音乐播放需要使用到 winmm.lib 库,如果你是使用的VC编译器,因为源代码中加了 #pragma 编译指令,会自动链接用到的一些库,所以你使用VC的编译器话,那么就不用手动添加链接库了。
      但是用 #pragma链接库只对VC编译器有效,所以使用CodeBlocksDevC++ 的需要手动添加链接库
      音乐播放相关需要用到 winmm.lib 库, 所以必须加到链接库里,否则会出现链接错误(undefined reference to)
    CodeBlocks 是加上libwinmm.a,如下图(配置时已经添加
    在这里插入图片描述
    DevC++ 是加上 -lwinmm 的编译参数(有些教程的配置里没加上,自己检查一下)
    在这里插入图片描述
    64位链接库的编译参数是

    -lgraphics64 -luuid -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32 -lwinmm -lgdiplus

    32位链接库的编译参数是

    -lgraphics -luuid -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32 -lwinmm -lgdiplus

    二、 MUSIC类

      EGE有用于控制音乐播放的 MUSIC类, 是对 windowsAPI的一个封装,调用了 <mmsystem.h> 中的函数。
      类定义如下:

    typedef unsigned long DWORD;
    
    class MUSIC
    {
    public:
    	MUSIC();
    	virtual ~MUSIC();
    	operator HWND()const{ return (HWND)m_dwCallBack; }
    public:
    	int   IsOpen() { return (m_DID != MUSIC_ERROR) ? 1 : 0; }
    	DWORD OpenFile(LPCSTR  filepath);
    	DWORD OpenFile(LPCWSTR filepath);
    	DWORD Play(DWORD dwFrom = MUSIC_ERROR, DWORD dwTo = MUSIC_ERROR);
    	DWORD Pause();
    	DWORD Seek(DWORD dwTo); //播放位置定位,单位为ms
    	DWORD SetVolume(float value);
    	DWORD Close();
    	DWORD Stop();
    	DWORD GetPosition();
    	DWORD GetLength();
    	// 以下函数GetPlayStatus的返回值为以下之一(意义看后缀):
    	// MUSIC_MODE_NOT_OPEN   //没有正确打开
    	// MUSIC_MODE_NOT_READY  //设备没准备好 (较少使用)
    	// MUSIC_MODE_PAUSE  //暂停中
    	// MUSIC_MODE_PLAY   //正在播放
    	// MUSIC_MODE_STOP   //成功打开后,或者播放完是这个状态
    	// MUSIC_MODE_OPEN   //打开中 (较少使用)
    	// MUSIC_MODE_SEEK   //定位中 (较少使用)
    	DWORD GetPlayStatus();
    private:
    	DWORD       m_DID;
    	PVOID       m_dwCallBack;
    };
    

    三、让音乐播放起来

    先把文件扩展名显示设置打开

    打开 文件资源管理器, 勾选上文件扩展名。这样就能看到完整的文件名。
    在这里插入图片描述

    进入当前目录

      如果你的源文件是新建的,那么就是源文件所在的目录。
      源文件就是你的代码文件, 建项目的时候创建有 .cpp 文件,懂吧?
    在这里插入图片描述

    把音乐文件放到源文件旁边

      东西比较多,显得凌乱,为了简单方便,就直接把音乐文件放在源文件旁边。
    在这里插入图片描述

    播放音乐的程序

    • 先定义一个MUSIC类变量
    	MUSIC music;
    
    • 使用music.OpenFile( )打开音乐文件
      还可以使用 music.IsOpen() 检查是否打开了文件,打开成功返回true, 失败则返回false;
    music.OpenFile("音乐文件名(带扩展名)");
    
    if (music.IsOpen())
    {
    	//文件已被成功打开
    }
    
    • 使用music.Play()播放音乐
    music.Play();
    

    所以想要打开音乐播放,使用如下代码便可

    MUSIC music;
    music.OpenFile("音乐文件名");
    music.Play();			//当然,如果没打开成功,是播放不出来的
    

    测试程序

      下面这个是音乐播放测试
    在这里插入图片描述
      改成自己的音乐文件名, 带扩展名, 比如上面这首,就写成:(因为之前文件是放在源文件旁边的,所以在相对路径里可以省去文件前面的路径,只写文件名就可以了)

    music.OpenFile("马步谣-双笙.mp3");
    
    • 先调节一下电脑的音量大小,以免放不出声音是因为没开声音

    在这里插入图片描述
      如果无法播放,请检查一下 文件名 是否写正确了。 (是否带了文件扩展名,路径是否正确,可以用绝对路径试试)
      如果文件名写对了还是无法播放,往后看,有解决办法。

    #include <graphics.h>
    
    int main()
    {
    	initgraph(640, 480, 0);
    	setbkcolor(WHITE);
    	setcolor(BLACK);
    	setfont(40, 0, "楷体");
    
    	MUSIC music;
    	music.OpenFile("音乐名文件名(带扩展名)");
    	
    	//检查是否打开
    	if (music.IsOpen())
    	{
    		xyprintf(200, 220, "%s\n", "音乐打开成功");
    		music.Play();
    	}
    	else
    	{
    		xyprintf(200, 220, "%s\n", "音乐打开失败");
    	}
    	
    	getch();
    
    	music.Close();
    
    	closegraph();
    
    	return 0;
    }
    

    如果音乐文件名正确,但是还是无法打开音乐文件

      可能是音乐文件的格式不兼容,所以打不开

    解决方案

      对音乐文件使用格式转换软件进行转码。比如常用的QQ音乐播放器,里面就有音频转码功能。把音乐放进去转码一次,转换完成后应该就能打开了。

    具体操作
    1. 打开QQ音乐播放器,点击右上角选项按钮,选择 音频转码
      在这里插入图片描述
    2. 点击添加歌曲,选择转换的音乐文件(可以在文件夹里先按住Ctrl,再分别点击要选的音乐文件,可以多选),然后选择保存位置的位置,最后点击开始转换,转换完成后,点击打开文件夹就能看到转化后的音乐文件了,此时就可以使用了。
      在这里插入图片描述

    四、音乐播放器控制

    MUSIC类使用方法:

    1. 使用 OpenFile() 打开音乐文件

      打开音乐文件用的是 OpenFile() 函数, 参数是带扩展名的音乐文件名。
      比如我有个文件名为 musicFile.mp3的文件,在当前工作目录下(当前工作目录,一般是与新建的源文件同一个目录)。或者你直接使用带全路径的文件名
      那么打开文件方法如下:

    	music.OpenFile("musicFile.mp3");
    

    2. 使用 IsOpen() 检测音乐文件是否成功打开

    • 成功打开返回 true,否则返回false

    播放之前最好先判断一下文件是否已经打开,否则可能会出现意外的结果

    if (music.IsOpen()) {
    	音乐文件已经成功打开
    }
    

    GetPlayStatus() 获取播放状态

      下面可以获取播放状态

    DWORD playStatus = music.GetPlayStatus();
    

      返回值是以下枚举值之一, 可以根据状态来判断。
      比如,播放完毕自动重放,可以检查状态是否为 MUSIC_MODE_STOP, 是的话就 Play(0)

    enum music_state_flag {
       MUSIC_MODE_NOT_OPEN = 0x0,			未打开文件
       MUSIC_MODE_NOT_READY = 0x20C,		没准备好
       MUSIC_MODE_PAUSE = 0x211,			暂停播放状态
       MUSIC_MODE_PLAY = 0x20E,				正在播放
       MUSIC_MODE_STOP = 0x20D,				停止播放状态
       MUSIC_MODE_OPEN = 0x212,				已打开文件
       MUSIC_MODE_SEEK = 0x210,				播放进度条调整(未播放)
    };
    

      音乐打开加载完成后,播放状态为 MUSIC_MODE_STOP

    3. 使用 Play() 播放音乐

      播放之前最好先判断一下文件是否已经打开,否则可能会出现意外的结果

      检测到音乐文件已经成功打开后,便可以播放音乐。
      函数声明如下:
      下面的时间指的是音乐的时间,单位是毫秒

    DWORD Play(DWORD dwFrom = MUSIC_ERROR, DWORD dwTo = MUSIC_ERROR);
    

    Play(开始时间, 结束时间)

    • 继续播放使用
    music.Play();
    
    • 从音乐某个时间开始播放至音乐结束
    music.Play(开始时间);
    

      而且 music.Play(开始时间) 还可以调整播放进度,而且是立即播放
      播放时状态是MUSIC_MODE_PLAY

    • 从音乐某个时间开始播放,播放到指定时间停止
    music.Play(开始时间, 结束时间);
    

    Pause() 暂停播放

      暂停后状态是 MUSIC_MODE_PAUSE

    music.Pause();
    

    Seek() 调节播放进度

      但是我实验了好像Seek() 不能用,可以用 Play(时间) 代替

    	music.Seek( 毫秒数);
    

      换成下面这个

       music.Play(毫秒数);
    

    Stop() 停止播放

    停止是调用Stop()
    调用后,播放状态是MUSIC_MODE_STOP
    调用 Stop(), 仅仅是将播放状态设为MUSIC_MODE_STOP, 并且暂停播放
    但是播放进度并没有变,将停留在刚才的进度,你使用Play() 会从刚才停的地方继续播放。所以如果是处于停止状态,应该使用Play(0) , 而不是Play(),否则和暂停没区别

    如果想要进度马上调整到开始处,可以使用

       music.Play(0);
       music.Stop();
    

    停止后的播放应该是

    if (music.GetPlayStatus() == MUSIC_MODE_STOP) {
    	music.play(0);
    }
    

    GetLength() 获取音乐时长

    返回音乐的总时长,单位是毫秒。

    int musicDuration = music.GetLength();
    

    GetPosition() 获取音乐播放进度

    (已播放的时间,单位是毫秒)

    int playTime = music.GetPosition();
    

    SetVolume() 调节音量

    参数是float 型的,范围是0.0 ~ 1.0, 0表示没有声音,大于1和1无差别
    默认是1.0
    (这个音量是基于电脑的扬声器大小调节的,不会改变电脑的扬声器大小)

    music.SetVolume(volume);
    

    Close() 关闭音乐文件

    不使用当前音乐后,可以关闭当前音乐文件,同时音乐播放也就停止了。
    如果想要用同一个 MUSIC 对象打开另一个音乐文件,需要先关闭再打开。
    MUSIC类对象被销毁时自动调用Close()进行关闭

    music.Close();
    

    五、音乐播放状态切换示例

    控制的时候先获取一下播放状态

    • 播放
      第一次播放直接 Play() 就可, 如果是在播放时候切换状态,可以先检测一下,避免多余操作。
      方法: 如果是暂停,那么调用 Play() 继续播放,如果是停止,那么调用 Play(0) 重新播放(如果你停止的时候已经调用Play(0)将进度调整到了开头,那么直接用Play()就行)
    DWORD status = music.GetPlayStatus();
    if (status == MUSIC_MODE_PAUSE)
    	music.Play();
    else if (status == MUSIC_MODE_STOP)
    	music.Play(0);
    
    • 暂停
      如果正在播放,那么就暂停
    DWORD status = music.GetPlayStatus();
    if (status == MUSIC_MODE_PLAY)
    	music.Pause();
    
    • 停止
      如果处于播放或暂停,那么先调用 Play(0) 将进度调至开头,再调用 Stop() 停止(因为单单调用Stop()并不会改变播放进度)
    DWORD status = music.GetPlayStatus();
    if (status != MUSIC_MODE_STOP) {	
    	music.Play(0);
    	music.Stop();
    }
    
    • 播放暂停切换
    DWORD status = music.GetPlayStatus();
    if (status == MUSIC_MODE_PLAY)
    	music.Pause();
    else if (status == MUSIC_MODE_PAUSE)
    	music.Play();
    else if (status == MUSIC_MODE_STOP)
    	music.Play(0);
    
    
    • 调整播放进度
      直接调用Play(播放时间), 单位是毫秒

    六、注意事项

    音乐重复播放

      音乐自动播放完毕后,状态为 MUSIC_MODE_STOP = 0x20D,可以通过这个状态判断音乐是否播放结束,结束后从头开始播放即可。
      此时调用 Play() 是无法继续播放的, 需要使用 Play(0) ,设置播放进度到开始位置。
      播放结束判断及从头播放处理如下:
      需要注意,这需要周期检测,可以放到帧循环了。

    //如果音乐已经播放完毕
    if (music.GetPlayStatus() == MUSIC_MODE_STOP ) {
    	//从头开始播放
    	music.Play(0);
    }
    



    音乐播放示例程序

    音乐文件名替换成自己的

    如果遇到音乐不能播放,音乐文件名写成绝对路径形式试试,再不行就把音乐用QQ音乐音频转码过一遍,转mp3再试试

    #include <graphics.h>
    #include <string.h>
    #include <math.h>
    
    class ProgressBar
    {
    private:
    	//进度条样式参数
    	int x, y, width, height;	//位置,尺寸
    	color_t progressBkcolor;	//进度条背景色
    	color_t progressColor;		//进度条进度颜色
    	float progress;				//进度
    
    public:
    	ProgressBar(int x, int y, int width, int height) : x(x), y(y), width(width), height(height) {
    		progressBkcolor = LIGHTGRAY;
    		progressColor = LIGHTBLUE;
    		progress = 0.0f;
    	}
    
    	void setProgress(float progress) {
    		this->progress = progress;
    		draw();
    	}
    
    private:
    	void draw() {
    		int cur = (int)(x + width * progress);
    
    		setfillcolor(progressColor);
    		bar(x, y, cur, y + height);
    		setfillcolor(progressBkcolor);
    		bar(cur, y, x + width, y + height);
    	}
    };
    
    int main()
    {
    	initgraph(640, 480, INIT_RENDERMANUAL);			//初始化窗口
    	setcaption("EGE音乐播放");		//设置窗口标题
    
    	setbkcolor(WHITE);
    	setcolor(BLACK);
    	setfont(16, 0, "楷体");
    
    	xyprintf(20, 20, "按空格键播放/暂停, S 键停止");
    	xyprintf(20, 40, "P键增大音量,M键减小音量");
    	xyprintf(20, 60, "N键前进,B键后退");
    	xyprintf(20, 80, "Q键退出");
    
    	setcolor(LIGHTBLUE);
    
    	//手动渲染模式,先刷新一下窗口,让背景色先出来
    	//因为音乐加载需要时间,这段时间窗口是黑色的
    	delay_ms(0);
    
    	MUSIC music;
    	//音乐文件名,改成自己的音乐
    	const char* musicFile = "resource/music/薛之谦 - 花儿和少年.mp3";
    	//找歌名位置
    	int len = strlen(musicFile);
    	while (len >= 0 && musicFile[len] != '/' && musicFile[len] != '\\') {
    		--len;
    	}
    	const char* musicName = musicFile + len + 1;
    	music.OpenFile(musicFile);
    
    	if (music.IsOpen()) {
    		ProgressBar progressBar(20, 200, 500, 20);
    		progressBar.setProgress(0.0f);
    
    		music.Play(0);
    
    		int playTime = 0;				
    		int totalTime = music.GetLength();		//获取音乐总时长(单位:毫秒)
    		float volume = 0.8f;					//音量	
    		music.SetVolume(volume);
    
    		xyprintf(20, 160, "音乐名:%s", musicName);
    		xyprintf(400, 240, "音乐总时长:%02d:%02d",
    			totalTime / 1000 / 60, totalTime / 1000 % 60);
    
    		bool exit = false;
    
    		//上次调节进度时间
    		double lastAdjustTime = fclock(), curtime = lastAdjustTime;
    
    		//检测键盘,控制音乐播放
    		for (; is_run(); delay_fps(20)) {
    			if (exit)
    				break;
    
    			while (kbmsg()) {
    				key_msg keyMsg = getkey();
    				if (keyMsg.msg != key_msg_down)
    					continue;
    
    				DWORD status = music.GetPlayStatus();
    				int key = keyMsg.key;
    				switch (key) {
    				case 'Q':		//退出
    					exit = true;
    					break;
    				case ' ':		//播放暂停切换
    					if (status == MUSIC_MODE_PLAY)
    						music.Pause();
    					else if (status == MUSIC_MODE_PAUSE)
    						music.Play();
    					else if (status == MUSIC_MODE_STOP)
    						music.Play(0);
    					
    					break;
    				case 'S':		//停止
    					if (status != MUSIC_MODE_STOP) {	
    						music.Play(0);
    						music.Stop();
    					}
    					break;
    
    				case 'P':		//增加音量
    					if ((volume += 0.1f) >= 1)
    						volume = 1;
    					music.SetVolume(volume);
    					break;
    				case 'M':		//减小音量
    					if ((volume -= 0.1f) < 0)
    						volume = 0;
    					music.SetVolume(volume);
    					break;
    				case 'N':		//快进
    					//no-break;
    				case 'B':		//快退
    					curtime= fclock();
    					if (curtime- lastAdjustTime < 0.3)
    						break;
    					lastAdjustTime = curtime;
    
    					if (key == 'N') {
    						playTime += 10 * 1000;
    						if (playTime > totalTime)
    							playTime = totalTime;
    					}
    					else {
    						playTime -= 10 * 1000;
    						if (playTime < 0)
    							playTime = 0;
    					}
    					music.Play(playTime);
    					break;
    				}
    			}
    			//获取播放时间(毫秒)
    			int pos = music.GetPosition();
    
    			//更新进度条
    			if (pos != playTime) {
    				playTime = pos;
    				progressBar.setProgress(playTime * 1.0f / totalTime);
    			}
    			xyprintf(20, 240, "播放进度%02d:%02d", playTime / 1000 / 60, playTime / 1000 % 60);
    			xyprintf(20, 280, "音量%3.0f%%", (volume * 100));
    		}
    
    		//关闭音乐
    		music.Close();
    	}
    	else {
    		xyprintf(50, 200, "打开音乐失败,请检查音乐文件名");
    		getch();
    	}
    
    	closegraph();
    
    	return 0;
    }
    

    在这里插入图片描述
      播放、暂停、停止,前进后退,显示音乐时长和播放进度,调节音量都已实现。


    EGE专栏:EGE专栏

    展开全文
  • js实现音乐播放控制条

    千次阅读 2021-06-11 03:22:50
    前言html5中提供audio标签, 该标签实现音频的播放,之前就一直对于音频...Audio实现思路浏览器原生提供的audio的样式比较简单而且不是太好看,原生提供的样式如下:自实现的音乐播放控制条, 效果如下:该音乐播放...

    前言

    html5中提供audio标签, 该标签实现音频的播放,之前就一直对于音频以及视频播放比较感兴趣,一直想要自己实现一个音频和视频播放的模块,这也是本文章撰写的初衷,最近花了些时间实现了Audio播放控制条,从这个小的模块实现也学习到了以前没有接触到的知识。

    Audio实现思路

    浏览器原生提供的audio的样式比较简单而且不是太好看,原生提供的样式如下:

    12e02cee9d6e303a06b401869e236ae7.png

    自实现的音乐播放控制条, 效果如下:

    f946022ba68134a2cfb1c33eb42145e7.png

    该音乐播放控制条实现的功能如下:

    音乐播放(最基本的)

    多首音乐的手动切换以及自动切换实现循环播放

    进度条点击播放进度的改变

    进度条拖动播放进度的改变

    音量点击改变

    音量拖动改变

    具体的实现效果:

    0451222c14f8abb76437bf32862d84b0.gif

    下面就具体功能的实现具体展开,实现的音乐播放控制进度条主要是学习使用,没有考虑兼容性,下面主要讲解每个功能的实现思路:

    整体

    整个音乐播放的控制底层还是采用浏览器audio标签来实现,调用audio api来实现整体的功能,下面是当前控制条的html结构:

    audio-controller:是控制播放以及切换歌曲的区域

    audio-bar:是时间以及歌曲进度的区域

    audio-volume:是音量调节的区域

    播放区域

    该区域实现音乐的播放、暂停、切换(上一首、下一首),这部分其实没有什么需要讲解的,实际上就是audio api中play()、pause()来实现播放与暂停的,歌曲的切换就是数组元素的改变,修改src地址而已。

    进度区域

    该区域是整个模块中核心的部分,该区域主要的功能点是:

    进度效果实现

    滑动效果实现

    首先进度实现,思路是:

    1.进度条有两个div构成:

    // 最外层作为进度条暗的长度区域

    // 最内层是实际表示进度

    9141f7e1ef2671444ae4844be5727ea7.png

    2.当点击进度条,获取鼠标点击该点的相对于最近的父类元素的x轴方向的偏移量

    3.偏移量就是内层div的实际宽度,设置背景色

    4.滑块的位置是设置left的值,但是left的值是:偏移量-滑块宽度/2

    滑动的实现,在该模块编写中没有采用html5中的拖放api,而是采用mousedown、mousemove、mouseup来实现的,具体

    实现代码:

    // 滑动效果

    bar.addEventListener('mousedown', function(e) {

    e.stopPropagation();

    // 获取滑块被选择时相对文档的初始X轴值

    options.clientX = e.clientX;

    // 偏移量

    options.left = this.offsetLeft;

    options.max = bgNode.offsetWidth - this.offsetWidth / 2;

    options.isDrag = true;

    });

    document.addEventListener('mousemove', function(e) {

    e.stopPropagation();

    if (options.isDrag) {

    let currentClientX = e.clientX,

    left = options.left,

    max = options.max,

    initClientX = options.clientX,

    barHalfWidth = bar.offsetWidth / 2,

    fgWidth = 0,

    // 设置要滑动到的位置点(x轴方向偏移量)

    to = Math.max(0, Math.min(max, left + (currentClientX - initClientX)));

    bar.style.left = to + 'px';

    if (to > barHalfWidth) {

    fgWidth = to + barHalfWidth;

    }

    fgNode.style.width = Math.max(0, fgWidth) + 'px';

    options.offsetX = Math.max(0, fgWidth);

    }

    });

    bgNode.parentNode.addEventListener('mouseup', function(e) {

    e.stopPropagation();

    if (options.isDrag) {

    // 绘制此时的进度

    tools.timeUpdateOrVolumeUpdate(options.offsetX, type);

    options.isDrag = false;

    }

    });

    简单来说就是:

    mousemove时获取当前鼠标在文档中的X轴方向位置 - 初始位置 + 元素最初的偏移量,动态改变left的值来实现的

    进度实际就是div的宽度来显示的,动态的改变width的值以及滑块的left值来实现进度效果

    这里需要注意的是:

    当前进度条总宽度与音频总时间之间的比例关系,从而计算不同音频时间点对应的进度的长度,这是基础

    实际上这也非常好计算:

    比例:width / duration

    指定时间的宽度:(width / duration) * currentTime

    音量调节的实现与进度相似,主要是改变volume的实现。

    下面就说说该模块中存在的问题:

    滑块效果有时不够自然顺畅

    音频文件时间的处理不够好

    开始时进度部分不是太好

    代码会上传到我的Github,该模块日后还需要进行改进。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 如何使用html实现音乐播放

    千次阅读 2021-06-11 10:27:53
    如何使用html实现音乐播放发布时间:2021-03-06 10:03:29来源:亿速云阅读:63作者:小新小编给大家分享一下如何使用html实现音乐播放,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读...

    如何使用html实现音乐播放

    发布时间:2021-03-06 10:03:29

    来源:亿速云

    阅读:63

    作者:小新

    小编给大家分享一下如何使用html实现音乐播放,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在html中可以使用“”标签定义声音,只需要在该标签的src属性中添加音频文件的url即可;具体语法格式“”。注:audio元素只支持MP3、Wav和Ogg三种音频格式文件。”标签定义声音,只需要在该标签的src属性中添加音频文件的url即可;具体语法格式“”。注:audio元素只支持MP3、Wav和Ogg三种音频格式文件。

    HTML5 提供了播放音频文件的标准。HTML>

    您的浏览器不支持音频元素。

    f2984ebb5ec30012ae8587581d8816ff.png

    说明:

    标签定义声音,比如音乐或其他音频流。

    src 属性规定要播放的音频的 URL。

    语法:

    bf1db1ab7ab7c2a73db4dfa6f75aae81.png

    音频格式及浏览器支持:

    目前, 元素支持三种音频格式文件: MP3, Wav, 和 Ogg:

    300c2b6f0bf432e278a97283558bcccb.png

    以上是“如何使用html实现音乐播放”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

    展开全文
  • JS控制音乐播放

    千次阅读 2021-06-05 07:04:10
    <!DOCTYPE HTML> <... <head>...meta charset="utf-8">...meta name="viewport" content="width=device-width, initial-scale=1.0">... 音乐 <audio src="C:\Users\Administrator\Mus
  • HTML音频:音乐播放网页

    千次阅读 2021-03-16 23:21:24
    HTML音频:音乐播放网页任务描述相关知识使用HTML5 audio元素播放属性使用雅虎媒体播放器播放使用超链接播放任务要求 任务描述 本关任务是编写一个在线播放音乐的网页,你将通过本关学习HTML播放音频的多种方式。 本...
  • Vue实现简单音乐播放

    万次阅读 2019-10-09 23:42:32
    发现html提供的audio标签是无法自动适应屏幕的,从网上找了个vue音乐播放组件vue-aplay 首先 cnpm install --save vue-aplayer 然后 <!--[0]"> </aplayer>--> import Aplayer from 'vue-aplayer' ...
  • 基于SpringBoot的在线音乐播放系统

    万次阅读 多人点赞 2021-05-23 14:51:36
    本项目是一个前后端分离的音乐播放系统项目,前端使用的Vue,后端使用的SpringBoot。前端分为前台用户界面和后台管理员界面。 用户界面的功能除了最基本的播放暂停、上一首下一首、下载歌曲,还有搜索、收藏、同步...
  • 第43篇 Android Studio实现音乐播放(五)播放音乐的方式8.播放音乐8.1.播放raw下的音乐8.2.设置播放源8.3.播放音乐的几个坑 8.播放音乐 Android播放音乐的几种方式 这一篇讲得很清楚,我目前只用了两种,就再细说...
  • NA8005不仅内置了马兰士...NA8005的6大使用方法:1、连接电脑,与用户的音乐图书馆无缝连接2、便捷的音乐娱乐,外接U盘与随身听3、无限音乐娱乐,精彩的网络电台与流媒体传输4、连接后级放大器,享受Hi-End的生活5、...
  • } import Foundation struct AudioHelper { /// APP内播放音视频,不影响后台音乐播放 static func notAffectedBackgroundPlay() { do { try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category....
  • 如何给Arduino项目添加音乐播放功能

    千次阅读 2021-10-03 01:39:15
    一、蜂鸣器播放音乐 说起单片机播放音乐,大家第一个想到的应该是无源蜂鸣器或喇叭。( 因无源蜂鸣器的工作原理与扬声器相同,此处混为一谈,但实际使用仍有区别 ),无论是51、Arduino、亦或是STM32,在入门时期都会...
  • java实现音乐播放功能

    千次阅读 2020-10-12 12:31:51
    java实现音乐播放功能 注意:音乐文件格式是WAV格式 (本文转载自CSDN——小白) 欢迎收看《好看的博文没人赞》系列 这里将实现一个音乐工具类,通过实例化该类传入音乐文件路径,可以进行随时调用播放、暂停、...
  • Android锁屏界面控制音乐播放

    千次阅读 2021-06-04 17:01:18
    目前,在锁屏界面控制音乐播放有两种常用方式。第一种方式:原生Android系统及自带音乐播放器。锁屏界面端:原生Android中,锁屏界面相关的UI由KeyguardHostView提供,KeyguardHostView向KeyguardUpdateMonitor注册...
  • 仿网易云音乐播放界面

    千次阅读 2019-01-10 17:28:09
    网易云音乐是一款非常优秀的音乐播放器,尤其是播放界面,使用唱盘机风格,显得格外古典优雅。笔者出于学习与挑战的想法,思考播放界面背后的实现原理,并写了一个小程序。 笔者尽可能地去模仿官方的视觉、交互效果...
  • 如何在H5页面上添加音乐播放

    千次阅读 2021-06-09 04:43:05
    在制作网页的时候,经常会遇到一些带音乐播放的场景,作品的右上角有一个音频按钮,会播放音乐,点击切换播放和暂停。下面就讲一讲如何在h5网页上添加音乐播放。其实是很简单的,只需要简单几步就可以完成了1、加入...
  • 微信小程序之音乐播放

    千次阅读 2020-10-26 10:33:38
    微信小程序之音乐播放 这次用的是API中的wx.createInnerAudioContext()接口 (创建内部 audio 上下文 InnerAudioContext 对象。) InnerAudioContext 对象中的属性 属性 string src 音频资源的地址,用于...
  • Vue实现音乐播放效果(适合小白学习)播放器介绍五个html主要标签功能介绍(1)搜索(2)播放效果:完整代码: 播放器介绍 总体的效果如图所示,没有加很多css特效,需要美化的小白,可以自行添加,本博客只负责介绍...
  • 如何使用手机控制电脑qq音乐播放

    千次阅读 2021-07-03 00:10:17
    手机的功能越来越强大,如今的手机可以实现控制电脑qq音乐播放的功能,下面就让学习啦小编告诉你如何使用手机控制电脑qq音乐播放,希望对大家有所帮助。使用手机控制电脑qq音乐播放的方法一这是打开手机QQ的播放界面...
  • 目录 项目背景 项目先决条件 项目文件 ... ...带有JavaScript的音频标签 ...有许多JavaScript库可用于在网站上显示视频和播放音乐内容。然而,随着HTML5及其音频和视频元素的出现,开发人员现在可以轻松地将视...
  • 电话于响铃模式时在电话接入的时候会先行停止音乐播放,然后播放电话铃音接着显示来电界面等待用户的接入操作; 2).电话为无声模式及用户没有设置响铃的模式,当用户在来电界面实施接听操作的时候系统会停止音乐...
  • 如何在java中简单实现音乐播放

    万次阅读 多人点赞 2019-07-16 20:00:33
    如何实现java程序播放音乐文件(以wav文件为例) Java Sound API是javaSE平台提供底层的(low-level)处理声音接口,可以实现音频文件的播放。 根据这点我们可以尝试写一个类播放音乐: 关键: File AudioInput...
  • 微信小程序——背景音乐播放

    千次阅读 2021-05-05 18:03:19
    1、要实现如图所示的小程序背景音乐添加: 2、实现 在微信小程序开放文档...// 处理音乐播放 musicControl() { let isMusic = !this.data.isMusic this.setData({ isMusic }) // 控制音乐播放 let { dataUrl
  • 简单音乐播放暂停继续

    千次阅读 2019-06-17 12:30:08
    简单音乐播放暂停继续 链接 https://blog.csdn.net/zk673820543/article/details/50513678
  • 而今天给大家介绍的就是利用Windows 10 的任务计划程序来帮助我们让我们在开启锁屏的同时暂停音乐播放,当解锁后再自动开始音乐,需要的朋友就一起来了解一下吧: 准备材料 下载我们本次所需要的工具NirCmd:官方...
  • 一、音乐播放: 先在LessonX.cpp 中加入头文件: #include<windows.h> #include<mmsystem.h> #pragma comment(lib,"Winmm.lib") 再在想播放的地方加上: PlaySound("game/data/audio/fate.wav",...
  • vue项目添加音乐播放插件

    千次阅读 2020-09-06 23:10:15
    npm install vue-aplayer -s 我们需要在main.js里面导入并引用 import vueAplayer from 'vue-aplayer' Vue.use(vueAplayer) 我们需要在使用的vue文件里面引入 ...import aplayer from 'vue-aplayer' ...
  • //音乐播放 $ ( "#audio" ) . play ( ) ; flag = false ; } } ) /*项目中运用到写法 $(".music").click(function(){ var music = document.getElementById("video"); if(music.paused){ music....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 162,110
精华内容 64,844
关键字:

音乐播放