一个简单的人 —— 我的世界一就是一,二就是二,没有太多模糊

用php编程处理音乐库文件

我有一个乾盛龙的解码器,播放音乐用的。但使用发现有些flac格式的音乐文件不能播放,格式识别不好。

于是想到了用软件转一下格式,用foobar 2000把flac转flac,估计即可以播放。

但我的音乐盘有1600多首flac,而且分布在不同目录下,如果一个个目录手动转会麻烦。而且foobar有个缺点,同格式转换,无法覆盖原文件,会报错(如果不进行覆盖会怎么样?会导致旧的文件也保留下来了)。也就是,没办法进行批量的不同文件夹的文件进行转换覆盖。

后来我想到了ffmpeg,一个开源的流媒体转码服务。php不是支持么,我经常用来程序压缩视频文件的。

准备工作:先想办法让php能访问非www根目录以上的其他盘的文件。由于我用的是虚拟机,很容易就把其他盘通过共享目录的方式挂载进来了。测试发现php能读写非根目录以上的文件!惊喜地,第一步完成了。

好了,拿一个目录进行测试,可以转换,并且能实现覆盖转换(其实就是程序拷贝到一个临时目录,转换后覆盖回去,即可)。

然后就是把flac格式的文件全部找出来了,使用php的glob命令即可。设置php无限执行时间,开始转换。发现临时目录一直有拷贝新文件,就知道在工作了。

    public function flac()
{
    ignore_user_abort(true);
    set_time_limit(0);
    die;

    $dir_clean = '/mnt/hgfs/F/手机';
    $listExist1 = glob($dir_clean . '/*/*.flac');
    $listExist2 = glob($dir_clean . '/*/*/*.flac');
    $listExist3 = glob($dir_clean . '/*/*/*/*.flac');

    $listExist = array_merge($listExist1, $listExist2, $listExist3);

    $temp = '/mnt/hgfs/F/php/tmp.flac';
    $i = 0;

    foreach ($listExist as $key => $item) {
        if (time() - filectime($item) > 3600 * 24 * 2) {
            $command = $item;
            copy($item, $temp);
            $command = "ffmpeg -i \"{$temp}\" -acodec flac \"{$item}\" -y";
            exec($command);
            $i = $i + 1;
            echo "[{$i}][{$key}] - {$command}<br>";
        }
    }
}

经过漫长的等待,大概2个小时,全部处理完了。

这个操作总算成功了!冲杯咖啡吧!

后来发现qq音乐下载的音乐文件,文件名总是在后面添加[msqms]之类的标识,影响文件查看。以前都手工一个个名字改的,现在不是可以php处理了吗?哈哈哈,几行代码完成搜索和重命名!

我发现用php还可以做很多事情!就是音乐文件管理,整理歌曲名,设置歌曲歌手tag信息等!甚至可以在线播放媒体库,像电脑播放器软件一样也可以实现!

当然,也有危险性,例如php很容易地,两三行代码就全部删掉所有文件,哈哈,这就要小心备份了。

后面慢慢玩了。

已有 3 条评论
  1. 大致

    活都是ffmpeg干的,功劳却算给了php……
    用shell也一样能实现。

    大致   Windows 7 / Firefox 回复
    1. 星球彦

      对,其实php是借用shell,不过搜索文件列表,还有拷贝覆盖都是php做的,这样整一下才好玩啊,批量处理1600个文件,然后冲杯咖啡 (`・ω・´)

      星球彦   Android 8.0.0 / Google Chrome 回复
  2. 星球彦

    哇哈哈

    星球彦   Android 8.0.0 / Google Chrome 回复
发表新评论