TMediaPlayer播放歌曲弹出警告No MCI device open(求助)

时间:2022-02-22 10:14:12
如题,以下是鼠标双击歌曲列表ListBox之后的代码:
void __fastcall TForm1::ListBox1DblClick(TObject *Sender)  //双击歌曲文件列表某行
{

        MediaPlayer1->FileName=ListBox1->Items->Strings[ListBox1->ItemIndex];
                              //将选中的歌曲文件的路径送给播放器TMediaPlayer
        Label1->Caption=MediaPlayer1->FileName; // Label1显示歌曲文件的路径
        MediaPlayer1->DeviceType=dtAutoSelect;// TMediaPlayer自动选择
        MediaPlayer1->Open(); //打开播放器
        MediaPlayer1->Play();                 //播放歌曲
        n=ListBox1->ItemIndex;               //歌曲序号
        Timer2->Enabled=true;//打开控制Label1的定时器,让歌曲文件路径横向移动                
}

出错歌曲路径:
F:\音乐天地\SogouMusic\
C? bé mùa ??ng - Th?y Tiên - ??ng Kh?i.mp3

很多歌曲都可以正常播放,就是跳到几首歌曲之后就会出现以上错误了,警告窗口不停
地弹出来,关都关不掉。根据出错的歌曲路径可以看出,大概是歌曲文件名TMediaPlayer
识别不了吧?我把那首歌曲换成其他正常的名字就可以播放了。。。我是新手,请问各位
有什么办法处理这种情况?我试过try/catch语句,貌似没什么变化。。。

15 个解决方案

#1


显示乱码的这个歌曲名字到底是什么呢?

#2


哈哈,那是一首越南歌,估计是播放器识别不了吧,其他还有一些文件名字不规则那些也放不了,我都不知道该怎么办。。。

#4


ListBox里面我存的全部是歌曲路径,不懂怎么筛选出文件名。

#5


看起来, 好像是MediaPlayer不支持Unicode文件名.

2009以后的版本中可能会支持.

#6


引用 4 楼 sixrobberbob 的回复:
ListBox里面我存的全部是歌曲路径,不懂怎么筛选出文件名。


简单方法就是判断文件名中是否包含有'?'这个字符.
ListBox1->Items->Strings[ListBox1->ItemIndex].Pos("?") > 0

#7


有什么办法让播放器识别不了那首歌曲之后自动跳出到其他地方吗?

#8


晕, 插队了. 看我6楼回复即可.

#9


引用 8 楼 ccrun 的回复:
晕, 插队了. 看我6楼回复即可.

谢谢了,现在我的程序都写了那么多了,我想知道那个警告窗口是TMediaPlayer给的吗?怎么会一直不停啊?

#10


警告窗口是MediaPlayer弹出的. 一直不停的弹, 这个原因不明.

#11


引用 10 楼 ccrun 的回复:
警告窗口是MediaPlayer弹出的. 一直不停的弹, 这个原因不明.

记得以前是只弹一次而已的,现在是不是程序写到了滚动条之后受到太多定时器的影响啊,我屏蔽掉所有定时器,还是那样。。。

#12


可能是和你的代码有关系.

不过你屏蔽掉文件名异常的歌曲就行了.

#13


引用 10 楼 ccrun 的回复:
警告窗口是MediaPlayer弹出的. 一直不停的弹, 这个原因不明.

void __fastcall TForm1::Timer4Timer(TObject *Sender)
{
        int TheLength;
        int mMinutes;
        int mSeconds;
        int numbe;
        int time1,time2,time4,time5;
        numbe=ListBox1->ItemIndex;
        if(numbe==-1)
        {
        time1=0;
        time2=0;
        time4=0;
        time5=0;
        Label4->Caption=time1;
        Label5->Caption=time2;
        Label6->Caption=time4;
        Label7->Caption=time5;
        }
        else
        {
        MediaPlayer1->TimeFormat=tfMilliseconds;
        TheLength=MediaPlayer1->Position/1000;
       //mHours=TheLength/3600;
        mMinutes=(TheLength%3600)/60;
        mSeconds=(TheLength%3600)%60;
        time1=(mMinutes%60)/10;
        time2=(mMinutes%60)%10;
        time4=mSeconds/10;
        time5=mSeconds%10;
        Label4->Caption=time1;
        Label5->Caption=time2;
        Label6->Caption=time4;
        Label7->Caption=time5;

        MediaPlayer1->TimeFormat=tfMilliseconds;
        ImageTrack->Canvas->Brush->Color=clBlack;
        ImageTrack->Canvas->Rectangle(0,0,ImageTrack->Width,ImageTrack->Height);
        ImageTrack->Canvas->Brush->Color=clMaroon;
        ImageTrack->Canvas->Rectangle(0,0,ImageTrack->Width*(float(MediaPlayer1->Position)/float(MediaPlayer1->Length)),ImageTrack->Height);
        }
}
我找出原因啦,应该是这个进度条的定时器影响,因为之前读取歌曲的时候失败了,但是这个定时器的TheLength=MediaPlayer1->Position/1000;语句一直执行,所以才会不停地弹出警告,现在只弹一次警告了,算是好多了,呵呵,谢谢妖哥,以后多多关照啊。

#14


解决了就好.  TMediaPlayer播放歌曲弹出警告No MCI device open(求助)

#15


哎呀,我就是想看这个警告 No MCI device open    是怎么消除的。。。。。最后还是没消除啊

#1


显示乱码的这个歌曲名字到底是什么呢?

#2


哈哈,那是一首越南歌,估计是播放器识别不了吧,其他还有一些文件名字不规则那些也放不了,我都不知道该怎么办。。。

#3


#4


ListBox里面我存的全部是歌曲路径,不懂怎么筛选出文件名。

#5


看起来, 好像是MediaPlayer不支持Unicode文件名.

2009以后的版本中可能会支持.

#6


引用 4 楼 sixrobberbob 的回复:
ListBox里面我存的全部是歌曲路径,不懂怎么筛选出文件名。


简单方法就是判断文件名中是否包含有'?'这个字符.
ListBox1->Items->Strings[ListBox1->ItemIndex].Pos("?") > 0

#7


有什么办法让播放器识别不了那首歌曲之后自动跳出到其他地方吗?

#8


晕, 插队了. 看我6楼回复即可.

#9


引用 8 楼 ccrun 的回复:
晕, 插队了. 看我6楼回复即可.

谢谢了,现在我的程序都写了那么多了,我想知道那个警告窗口是TMediaPlayer给的吗?怎么会一直不停啊?

#10


警告窗口是MediaPlayer弹出的. 一直不停的弹, 这个原因不明.

#11


引用 10 楼 ccrun 的回复:
警告窗口是MediaPlayer弹出的. 一直不停的弹, 这个原因不明.

记得以前是只弹一次而已的,现在是不是程序写到了滚动条之后受到太多定时器的影响啊,我屏蔽掉所有定时器,还是那样。。。

#12


可能是和你的代码有关系.

不过你屏蔽掉文件名异常的歌曲就行了.

#13


引用 10 楼 ccrun 的回复:
警告窗口是MediaPlayer弹出的. 一直不停的弹, 这个原因不明.

void __fastcall TForm1::Timer4Timer(TObject *Sender)
{
        int TheLength;
        int mMinutes;
        int mSeconds;
        int numbe;
        int time1,time2,time4,time5;
        numbe=ListBox1->ItemIndex;
        if(numbe==-1)
        {
        time1=0;
        time2=0;
        time4=0;
        time5=0;
        Label4->Caption=time1;
        Label5->Caption=time2;
        Label6->Caption=time4;
        Label7->Caption=time5;
        }
        else
        {
        MediaPlayer1->TimeFormat=tfMilliseconds;
        TheLength=MediaPlayer1->Position/1000;
       //mHours=TheLength/3600;
        mMinutes=(TheLength%3600)/60;
        mSeconds=(TheLength%3600)%60;
        time1=(mMinutes%60)/10;
        time2=(mMinutes%60)%10;
        time4=mSeconds/10;
        time5=mSeconds%10;
        Label4->Caption=time1;
        Label5->Caption=time2;
        Label6->Caption=time4;
        Label7->Caption=time5;

        MediaPlayer1->TimeFormat=tfMilliseconds;
        ImageTrack->Canvas->Brush->Color=clBlack;
        ImageTrack->Canvas->Rectangle(0,0,ImageTrack->Width,ImageTrack->Height);
        ImageTrack->Canvas->Brush->Color=clMaroon;
        ImageTrack->Canvas->Rectangle(0,0,ImageTrack->Width*(float(MediaPlayer1->Position)/float(MediaPlayer1->Length)),ImageTrack->Height);
        }
}
我找出原因啦,应该是这个进度条的定时器影响,因为之前读取歌曲的时候失败了,但是这个定时器的TheLength=MediaPlayer1->Position/1000;语句一直执行,所以才会不停地弹出警告,现在只弹一次警告了,算是好多了,呵呵,谢谢妖哥,以后多多关照啊。

#14


解决了就好.  TMediaPlayer播放歌曲弹出警告No MCI device open(求助)

#15


哎呀,我就是想看这个警告 No MCI device open    是怎么消除的。。。。。最后还是没消除啊