国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

用PHP讀寫音頻文件的信息(支持WMA和MP3)

2024-09-04 11:50:10
字體:
來源:轉載
供稿:網友
這是之前花了不少時間和心思作了這個東西, 使用PHP去讀取或修改 MP3或WMA文件的頭信息(主要有專輯,歌名,歌手等)

其實網上搜索有不少 MP3 的類似程序,但 WMA 的幾乎沒有,如果有也是windows平臺下直接使用API的,想在 Unix/Linux 下使用簡直沒門。。。。

由于我的音樂站剛開通,需要這方面的功能,所以就下決心花時間去查資料搞清楚MP3和wma的數據頭格式,全部代碼由PHP編寫,有興趣可以仔細研究,或加以完善。

其實這東西技術上并沒有難點,麻煩在于先要搞清楚它的結構和格式,這個代碼也是一個使用PHP操作二進制(binary data)的例子,這幾天群里剛好也有人問起這個,主要就是pack和unpack2個函數啦,呵呵,像MP3的原始頭信息幾乎是一個bit表示一個信息,這時就要用到大量的“按位操作”來分析它。

<?php
// AudioExif.class.php
// 用PHP進行音頻文件頭部信息的讀取與寫入
// 目前只支持 WMA 和 MP3 兩種格式, 只支持常用的幾個頭部信息
//
// 寫入信息支持: Title(名稱), Artist(藝術家), Copyright(版權), Description (描述)
//               Year(年代),  Genre (流派),   AlbumTitle (專輯標題)
// 其中 mp3 和 wma 略有不同, 具體返回的信息還可能更多, 但只有以上信息可以被寫入
// mp3 還支持 Track (曲目編號寫入)
// 對于 MP3 文件支持 ID3v1也支持ID3v2, 讀取時優先 v2, 寫入時總是會寫入v1, 必要時寫入v2
//
// 用法說明: (由于 wma 使用 Unicode 存取, 故還需要 mb_convert_encoding() 擴展
//           返回數據及寫入數據均為 ANSI 編碼, 即存什么就顯示什么 (中文_GB2312)
//
// require ('AudioExif.class.php');
// $AE = new AudioExif;
// $file = '/path/to/test.mp3';
//
// 1. 檢查文件是否完整 (only for wma, mp3始終返回 true)
//
// $AE->CheckSize($file);
//
// 2. 讀取信息, 返回值由信息組成的數組, 鍵名解釋參見上方
//
// print_r($AE->GetInfo($file));
//
// 3. 寫入信息, 第二參數是一個哈希數組, 鍵->值, 支持的參見上方的, mp3也支持 Track
//    要求第一參數的文件路徑可由本程序寫入
// $pa = array('Title' => '新標題', 'AlbumTitle' => '新的專輯名稱');
// $AE->SetInfo($file, $pa);
//
// 版本: 0.1
// 作者: hightman
// QQ群: 17708754  (非純PHP進階交流群)
// 時間: 2007/01/25
// 其它: 該插件花了不少時間搜集查找 wma及mp3 的文件格式說明文檔與網頁, 希望對大家有用.
//       其實網上已經有不少類似的程序, 但對 wma 實在太少了, 只能在 win 平臺下通過 M$ 的
//       API 來操作, 而 MP3 也很少有可以在 unix/linux 命令行操作的, 所以特意寫了這個模塊
//
// 如果發現 bug 或提交 patch, 或加以改進使它更加健壯, 請告訴我.
// (關于 ID3和Wma的文件格式及結構 在網上應該都可以找到參考資料)
//
if (!extension_loaded('mbstring'))
{
  trigger_error('PHP Extension module `mbstring` is required for AudioExif', E_USER_WARNING);
  return true;
}
// the Main Class
class AudioExif
{
  // public vars
  var $_wma = false;
  var $_mp3 = false;
  // Construct
  function AudioExif()
  {
    // nothing to do
  }
  // check the filesize
  function CheckSize($file)
  {
    $handler = &$this->_get_handler($file);
    if (!$handler) return false;
    return $handler->check_size($file);
  }
  // get the infomations
  function GetInfo($file)
  {
    $handler = &$this->_get_handler($file);
    if (!$handler) return false;
    return $handler->get_info($file);
  }
  // write the infomations
  function SetInfo($file, $pa)
  {
    if (!is_writable($file))
    {
      trigger_error('AudioExif: file `' . $file . '` can not been overwritten', E_USER_WARNING);
      return false;
    }
    $handler = &$this->_get_handler($file);
    if (!$handler) return false;
    return $handler->set_info($file, $pa);
  }
  // private methods
  function &_get_handler($file)
  {
    $ext = strtolower(strrchr($file, '.'));
    $ret = false;
    if ($ext == '.mp3')
    {  // MP3
      $ret = &$this->_mp3;
      if (!$ret) $ret = new _Mp3Exif();
    }
    else if ($ext == '.wma')
    {  // wma
      $ret = &$this->_wma;
      if (!$ret) $ret = new _WmaExif();
    }
    else
    {  // unknown
      trigger_error('AudioExif not supported `' . $ext . '` file.', E_USER_WARNING);
    }
    return $ret;
  }
}
// DBCS => gb2312
function dbcs_gbk($str)
{
  // strip the last " 主站蜘蛛池模板: 临澧县| 苏州市| 乌鲁木齐市| 托克逊县| 朝阳区| 大新县| 武陟县| 奇台县| 富裕县| 辽中县| 安庆市| 桃园县| 苍山县| 壤塘县| 融水| 石门县| 剑川县| 玛多县| 措美县| 星子县| 隆尧县| 榕江县| 凌源市| 阜南县| 开江县| 宁晋县| 峨边| 黔西| 曲麻莱县| 宁陕县| 乾安县| 任丘市| 伊金霍洛旗| 万盛区| 海阳市| 泗洪县| 蚌埠市| 上栗县| 察雅县| 玛多县| 米易县|