我正在尝试编写从用户的Windows Media Player库中读取每个项目的代码.此代码适用于大多数用户,但对于某些用户,getAll()
当他们的Windows Media Player库中明显包含数百或数千个项目时,将返回空列表.
var player = new WindowsMediaPlayer();
var collection = player.mediaCollection;
var list = collection.getAll();
int total = list.count;
Run Code Online (Sandbox Code Playgroud)
我WMPLib
通过添加对wmp.dll的COM引用来引用命名空间.我的应用程序随附Interop.WMPLib.dll.如何配置某些用户的计算机,使其在其库中运行带有许多歌曲的Windows Media Player,但WMPLib无法正常运行?此外,在所有情况下可靠地读取用户的Windows Media Player库有哪些变通方法?
我正在尝试以编程方式创建Windows Media Player控件,以便我可以捕获任何初始化错误.在我简单地将控件放在表单上之前,一切都很好.但是现在我正在尝试以编程方式播放视频,视频没有出现在控件中.我只看到黑色视频,但我听到了音频.
有任何想法吗?
public TrimVideoControl()
{
InitializeComponent();
// Try creating WMP control
// We do this here so we can gracefully catch errors if the control doesn't load
try
{
wmPlayer = new AxWMPLib.AxWindowsMediaPlayer();
((System.ComponentModel.ISupportInitialize)(wmPlayer)).BeginInit();
//SuspendLayout();
wmPlayer.CreateControl();
wmPlayer.Name = "wmPlayer";
wmPlayer.Ctlenabled = true;
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TrimVideoControl));
wmPlayer.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("wmPlayer.OcxState")));
wmPlayer.Location = new Point(12, 13);
wmPlayer.Size = new Size(636, 358);
wmPlayer.enableContextMenu = true;
wmPlayer.stretchToFit = true;
wmPlayer.uiMode = "none";
wmPlayer.settings.autoStart = false;
wmPlayer.ErrorEvent += wmPlayer_ErrorEvent;
wmPlayer.MediaChange += wmPlayer_MediaChange; …
Run Code Online (Sandbox Code Playgroud) 我想使用JavaScript来控制嵌入式Windows Media Player,以及访问播放器公开的任何属性.我在网上找到了一些hacky示例,但没有具体的内容.
我真的需要访问播放,暂停,停止,搜索,全屏等.我还希望能够访问播放器正在播放的任何事件.
帮助会很精彩(我已经有了一个Flash等效,只是你知道),谢谢!
我曾经在这里问过有关通过Java控制Windows Media Player的问题. 我已经取得了进步,但我遇到了一个棘手的问题,所以我回来寻求帮助.
我按照上次给出的建议,安装雅各布.我从测试脚本中执行这些行:
ActiveXComponent wmp = new ActiveXComponent("WMPlayer.OCX");
wmp.invoke("openPlayer", "http://somafm.com/wma128/groovesalad.asx");
Run Code Online (Sandbox Code Playgroud)
...和WMP弹出,玩SomaFM."W00t!" 我认为."我已经解决了这个问题!"
除了当我在创建它之后与该对象交互时,它似乎与WMP实例播放没有任何关系.当我执行此代码时:
ActiveXComponent wmpSettings = new
ActiveXComponent(wmp.getProperty("settings").toDispatch());
System.out.println("VOLUME: " + wmpSettings.getProperty("volume"));
wmpSettings.setProperty("volume", 0);
System.out.println("VOLUME: " + wmpSettings.getProperty("volume"));
Run Code Online (Sandbox Code Playgroud)
...我得到的输出:
VOLUME: 50 VOLUME: 0
这似乎无害,除此之外
我也尝试了其他属性,但它是一样的:属性的值似乎与玩家实际做的事情没有关系,而改变它们似乎改变了被操纵对象的状态,它对实际玩家没有影响. (每次运行脚本时,我都得到完全相同的输出,所以无论是什么,当我转动"音量"时我都会改变它,它在代码之外没有任何持久性.)
显然我做错了什么,但我一直摸索着试图找出什么.任何人都可以向我提供任何有关出错的信息,或者我接下来应该尝试的内容吗?
(注意:我甚至不确定"WMPlayer.OCX"是正确的输入参数.我在注册表中的HKEY_CLASSES_ROOT中试验了看起来很可能的条目,直到找到这个.)
我提前感谢任何人提供的任何帮助.
编辑,4/15/2009: 我在一家名为EZ JCom的公司的产品中找到了一个特定于WMP的软件包.它失败的方式与我之前看到的完全相同,要么它只是Jacob的包装器,要么是WMP ActiveX/COM接口完全坏了.(等等,为什么我说"要么"?)
我与客户服务人员聊天,他们最终展示了如何在没有实际用处的情况下提供帮助.他们帮助我纠正了他们提供的非编译示例代码作为他们的WMP代码的实例,但是当我纠缠他们以了解get/set卷方法应该如何工作时,我得到了这个:
"对不起,但这里没有WMP深度专业知识--EZ JCom只是Java与WMP等其他程序之间的桥梁建设者."
请记住,我评估的他们的包实际上被称为"wmp.WindowsMediaPlayer".如果我得到它的工作,我将不得不与我的老板谈论花费600美元的许可证.人们想知道如果他们真正拥有自己产品的专业知识,他们会收取什么费用.
所以,没有真正的进步.只是想我会分享.
编辑,2009年4月20日: 是的,我仍然在嘲笑这个.我目前的操作理论是,为了获得音量设置,我需要远程访问WMP.我已经看到了IWMPRemoteMediaServices和IServiceProvider接口的提及,后者的QueryService方法提供了指向前者的指针.不幸的是,我没有任何关于如何获得IServiceProvider的运气.我已经看到提到它可以从Windows"系统"对象访问,但我无法弄清楚如何获取该对象.(而且由于"系统"这个词在Java中非常重要,谷歌给了我一个喧闹的声音:信号比率.)如果有人对如何把手放在代表System.dll的COM对象上有任何建议,我很乐意听到.
编辑,4/21/2009: 澄清:这是在XP系统上.
另外:我的研究表明仅仅谈论WMP对象是不够的; 你需要把它包裹得更紧,所以它可以回复.有一个包含大量C++内容的WMP SDK,但它似乎依赖于Microsoft Visual C++对我没有的代码的扩展,并且它们不是免费赠送的.(此外,我在12年内没有完成C++.)我知道C#可以实现,但如果我不在Java之外,我需要将解决方案作为独立的可执行文件并且不安装.NET相关的机器.
编辑,2009年4月22日: 根据Mark的答案,我从WinUser.h中挖出了APPCOMMAND_MEDIA_*常量并尝试了以下代码,它使用了NativeCall api:
final int APPCOMMAND_MEDIA_PLAY = 46;
final int APPCOMMAND_MEDIA_PAUSE = …
Run Code Online (Sandbox Code Playgroud) 我使用 TMediaPlayer 组件来播放音乐。
它适用于我的大部分曲目。但它不适用于某些曲目。当我想播放它们时,会显示以下错误消息:
这是德语,但大致意思是:
在项目 pMusicPlayer.exe 中,发生了类 EMCIDeviceError 的异常。消息:“启动 MCI 时出错。”。进程已停止。继续“单个命令/语句”或“开始”。
程序调用TMediaPlayer的“Play”程序后直接退出。
例如,以下文件发生此错误:
我用 128 kBit/s 的比特率编码了这个文件,因此文件大小为 3.70 MB:它工作正常!
第一个文件有什么问题?Windows Media Player 或其他程序可以毫无问题地播放它。
Delphi 的 TMediaPlayer 是否可能无法处理大文件(例如 > 5 MB)或具有高比特率(例如 > 128 kBit/s)的文件?
我能做些什么来解决问题?
附加问题: 为什么我不能使用 try/except 来阻止消息窗口?
try
Player.Play;
except
showmessage('Cannot be played');
end;
Run Code Online (Sandbox Code Playgroud)
这不起作用。
我正在寻找有关什么决定MediaElement
可以播放的媒体格式的详细信息,我似乎无法找到任何明确的来源.我读过某个地方,如果它可以在WMP MediaElement
中播放,那么可以播放它.这是真的?如果是,那么我的下一个问题是我在哪里可以找到WMP的功能和限制?WPF MediaElement
和WMP 之间的联系在哪里?我正在寻找对WPF中这些组件和视频播放的更好理解,并且到目前为止还很难在网上找到任何东西.
我有一个OpenFileDialog
控件Multiselect = true
.现在我想将每个文件添加到Windows媒体播放器播放列表中,但我不知道如何做到这一点,并且在互联网上没有好的例子.
if (ofdSong.ShowDialog() == DialogResult.OK)
{
foreach (string file in ofdSong.FileNames)
{
//Code to add file to the playlist
}
}
Run Code Online (Sandbox Code Playgroud) 我在这里几乎没有想法......对于其他一切,将背景颜色设置为Color.Transparent或设置TransparencyKey工作正常...
我有一个mp4视频,我需要将其作为我的表单的"背景".为此,我目前正在使用WMP控件.我的问题:我不能在它上面添加任何控件,因为它们总是呈现背景.哪个看起来像**视频...
有什么建议?
c# vb.net visual-studio-2010 windows-media-player axwindowsmediaplayer
Windows Media Player Control的默认背景颜色为黑色.我们可以改变这种颜色吗?
我在msdn网站上发现DisplayBackColor属性可用于Windows CE,但在我的winforms应用程序中不可用.
还有其他改变方法吗?
我正在使用TWindowsMediaPlayer并遇到问题。当前歌曲完成后,我无法加载新歌曲然后播放。
procedure TMainWinForm.WMPlayer1PlayStateChange(Sender: TObject;
NewState: Integer);
begin
if (NewState = wmppsMediaEnded) then
begin
WMPlayer1.URL := FileScanner.SelectSong;
writeln('Play triggered on ', String(WMPlayer1.URL));
WMPlayer1.controls.Play; // DOES NOT PLAY THE SONG!
end;
end;
Run Code Online (Sandbox Code Playgroud)
这会加载歌曲,但需要其他用户干预才能实际播放。我要让它继续下去的唯一方法是检查wmppsStopped,但是该事件发生了两次,所以我得到了列表中的所有奇数编号的歌曲。
关于如何使其正确运作的任何想法?
c# ×5
.net ×2
delphi ×2
activex ×1
audio-player ×1
com ×1
javascript ×1
mediaelement ×1
mp3 ×1
playlist ×1
vb.net ×1
video ×1
wmp ×1
wpf ×1