尝试使用ID3_Tag信息在Qt中编写M3U文件

时间:2012-05-16 10:16:57

标签: c++ windows qt id3lib

我尝试制作一个M3U文件(播放列表),但是当我尝试编写文件时,我的程序崩溃而没有错误。

bool Playlist::savePlaylist(QString path)
{
    this->filename = path;

    QFile file(path);

    if((file.open(QIODevice::WriteOnly | QIODevice::Truncate)) == false)
    {
        return false;
    }

    QTextStream out(&file);
    if(out.status() != QTextStream::Ok)
    {
        return false;
    }

    out << "#EXTM3U" << endl;

     for(int i = 0 ; i < this->getSize() ; i++)
     {
         SongInfo si = this->songs.at(i);
         int durata = this->getLengthInSeconds(si.getAddress().toString(QUrl::None));

         out << "#EXTINF:" << durata << "," << ID3_GetArtist(&si.getTag()) << " - "
            << ID3_GetTitle(&si.getTag()) << endl;

         out << si.getAddress().toString(QUrl::None) << endl;
    }

    file.close();

    return true;
}

如果我尝试使用188个文件,光盘上的1.07 Gb大小,在大约100首歌曲之后程序崩溃。当我试图将SongInfo放到那个位置时,我得到了崩溃。如果我试着说30-40首歌曲,一切都很完美。我不知道会出现什么问题。我试图写块,并从内存中删除那些块,我用过flush。我不知道该怎么做,问题出在哪里。如果我写控制台那些信息(一个for循环只是为了打印)一切都很完美,但当我试着写...崩溃。

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

对我而言,如何使用this->getSize()迭代歌曲列表,然后使用SongInfo获取this->songs.at(i);,这看起来很奇怪。 thisthis->songs不是同一个对象,只是通过查看您的代码,无法知道getSize()的作用。

你想尝试一下吗?

int size = songs.size();

for(int i = 0 ; i < size ; i++)
{
   SongInfo si = this->songs.at(i);
   int durata = this->getLengthInSeconds(si.getAddress().toString(QUrl::None));

   out << "#EXTINF:" << durata << "," << ID3_GetArtist(&si.getTag()) << " - "
       << ID3_GetTitle(&si.getTag()) << endl;

   out << si.getAddress().toString(QUrl::None) << endl;
}

甚至更好,如果songsQList

foreach(SongInfo si, songs){
   int durata = this->getLengthInSeconds(si.getAddress().toString(QUrl::None));
   ...
}