利用树莓派 播放mp3,web远程操作

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ljxh401/article/details/81059809

1.在树莓派上面安装 mplayer

sudo apt-get install mplayer

2.在树莓派上面安装 nodejs

到nodejs官网上面下载最新的 nodejs
通过 ftp 放入 树莓派
解压 $ tar -xvf node-v8.11.3-linux-armv7l.tar.xz
并且 移动到 /usr/local/node
sudo mv node-v8.11.3-linux-armv7l /usr/local/node
更新环境变量
sudo echo PATH=$PATH:/usr/local/node/bin >> ~/.bashrc
刷新环境变量
source ~/.bashrc

3.安装express

安装 express 命令
npm install express -g
安装 express-generator,装了才能用命令行 生成 express 项目
npm i -g express-generator


4.生成项目 webmusic

express -e webmusic

在 webmusic 文件夹通过命令 npm install 添加 所需的安装包


5.添加代码

添加views文件及文件music.ejs 内容如下

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><%= title %></title>
<script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js" type="text/javascript" charset="utf-8"></script>
</head>
    
<body>
    <h1><%= title %></h1>
    <table width="100%" border="1" cellpadding="0" cellspacing="0">
           <tr>
                <td>编号</td>
                <td>歌曲</td>
                <td>操作</td>
          </tr>   
          <tbody id="bg">        
          </tbody>
    </table>
    <input type="radio" class="loop" name="test" value=0 checked>全部循环&nbsp;
    <input type="radio" class="loop" name="test" value=1 > 随机播放&nbsp;
    <input type="radio" class="loop" name="test" value=2 >单曲循环<br>

    <script>
        function shujv()
        {
        $.get("/music/list",
        function(data,status){
            var da=data.datas;
            var htmlstr;//="<tr><td>"+da.length+"</td><td>"+"</td><td>"+"</td><td>"+"</td><td></tr>";
            //alert("test:"+da.length);
            for(var i=0;i<da.length;i++)
            {
            var element=da[i];
            var tmp;
                htmlstr+="<tr><td>"+i+"</td><td>"+da[i]+"</td><td><input type='button' class='shanchu' value='play' code='"+i+"'></td></tr>"
            }
            $("#bg").html(htmlstr);
            $(".shanchu").click(function()
            {
                //alert($(this).attr("code"));
                var code=$(this).attr("code");
                $.get("/music/play/"+code,
                function(data,status){
                    //shujv();
                });
            });
        });
        }

        $(function(){
        shujv();
        $(".loop").click(function()
            {
                //alert($(this).attr("value"));
                var code=$(this).attr("value");
                $.get("/music/loop/"+code,
                function(data,status){
                    //shujv();
                });
            });
        });
    </script>
</body>
</html>

在routes添加lsfile.js文件代码如下,实现遍历文件夹文件

var fs = require("fs");
var tstpath = require("path");
var mp3list=[];
fs.readdir('/home/pi/Music', (err, files) => {
    if (err)
        throw err;
    files.forEach(file => {
        var filePath = tstpath.normalize('/home/pi/Music/' + file);
    //console.log(filePath);
        fs.stat(filePath, (err, stats) => {
            if (stats.isFile()) {
        //console.log(tstpath.extname(filePath));
        if(tstpath.extname(filePath)=='.mp3')
            {
                console.log(filePath + ' is: ' + 'file '+ mp3list.length);
            mp3list.push(filePath);
        }
            }
            //if (stats.isDirectory()) console.log(filePath + ' is: ' + 'dir');
        });
    });
});
module.exports=mp3list;

在routes添加music.js文件代码如下,实现遍历文件夹文件

var express = require('express');
var spawn=require('child_process').spawn;
var mp3list=require('./lsfile');
var router = express.Router();

var musicindex=0;
var musicloop=0;    //0 loop 1 rnd  2 only one

var player=null;
function playmusic(str){
    player= spawn('mplayer', [str]);           //这个是赋值 还是引用
    player.stdout.on('data', (data) => {
     // console.log(`输出:${data}`);
    });

    player.stderr.on('data', (data) => {
      //console.log(`错误:${data}`);
    });
    player.on('close', (code) => {
      //console.log(`子进程退出码:${code}`);
      if(code==0)
      {
            if(musicloop==0)    
            {
            musicindex=(musicindex+1)%mp3list.length;
        }
        else if(musicloop==1)
        {
            musicindex=parseInt(Math.random()*mp3list.length);
        }        
        playmusic(mp3list[musicindex]);
      }
      else    
      {
        
          }
    });
}


router.get('/',function(req, res, next) {
    res.render("music",{title:"JQMusicPlayer"});
});

router.get('/list',function(req, res, next) {
    //res.render("music",{});
    res.json({datas:mp3list});
});

router.get('/play/:id',function(req, res, next) {
    console.log("file:"+req.params.id);
    if(player!=null)
    {
        player.kill('SIGHUP');
        player=null;                 //这样能释放闭包数据吗? 能清除 它附带生成的
        console.log('kill process');
    }
    musicindex=req.params.id%mp3list.length;
    playmusic(mp3list[musicindex]);
    res.json({"pos":musicindex,"name":mp3list[musicindex]});
});

router.get('/loop/:mode',function(req, res, next) {
    musicloop=req.params.mode;
    res.json({"pos":musicindex,"name":mp3list[musicindex]});
});


module.exports={
    router:router
};

修改项目目录下的app.js文件,绿色的为增加的代码

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var music=require('./routes/music');

.......

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/music', music.router);


6.启动网页并访问

npm start

访问网页 127.0.0.1:3000/music





展开阅读全文

如何利用ATL播放MP3文件?

03-08

需要在程序中播放MP3文件,在MFC中我知道怎么弄,但在ATL/WTL下不知道该从何入手。下面的尝试是模仿MFC的做法,利用Active Movie Control。但是失败:rn rn//get the CLSID of Active Movie ControlrnCLSID const& GetClsid()rn rn static CLSID const clsidrn = 0x5589FA1, 0xC356, 0x11CE, 0xBF, 0x1, 0x0, 0xAA, 0x0, 0x55, 0x59, 0x5A ;rn return clsid;rn rn rn//get IDispatch interfacern::CoCreateInstance(GetClsid(), NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void **)&pIDispatch);rn rn//get DISPID of "FileName"rn DISPID dispid = -1;rn OLECHAR * name = L"FileName";rn hr = pIDispatch->GetIDsOfNames(IID_NULL, &name, 1, GetUserDefaultLCID(), &dispid);rn rn//set the filename to be demo.mp3rnwchar_t wszIn[] = L"demo.mp3";rn BSTR bstrIn = ::SysAllocString(wszIn);rn rn VARIANTARG varg;rn ::VariantInit(&varg);rn varg.vt = VT_BSTR;rn varg.bstrVal = bstrIn;rn rn DISPPARAMS param;rn param.cArgs = 1;rn param.rgvarg = &varg;rn param.cNamedArgs = 0;rn param.rgdispidNamedArgs = NULL;rn rn hr = pIDispatch->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_PROPERTYPUT, &param, NULL, NULL, NULL);rn rnGetIDsOfNames()调用成功,返回11。但是Invoke()调用失败。返回值是rn-2147352572。通过VC6自带的Error Lookuprn察看,返回信息“找不到参数”。rnrn在Invoke()调用失败后,通过GetLastError()获得失败信息,返回值为0。rnrn哪里出问题了呢?如果这种方法不行,请教用什么方法可以实现播放MP3文件呢?rnrn谢谢~~ 论坛

没有更多推荐了,返回首页