如何在 WP7 - Phonegap 中播放嵌入的视频?

Posted

技术标签:

【中文标题】如何在 WP7 - Phonegap 中播放嵌入的视频?【英文标题】:How to play embedded video in WP7 - Phonegap? 【发布时间】:2012-03-08 17:17:29 【问题描述】:

我需要在我的 WP7 phonegap 应用程序中播放嵌入的视频文件。该文件 (dizzy.mp4) 与以下布局一起位于 www 文件夹中

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title>PhoneGap WP7</title>
    <link rel="stylesheet" href="master.css" type="text/css" />
    <script type="text/javascript" charset="utf-8" src="phonegap-1.4.1.js"></script>
    <script type="text/javascript" charset="utf-8" src="jquery-1.6.4.min.js"></script>
</head>
<body>
    <video onclick="play()">
        <source src="http://html5demos.com/assets/dizzy.mp4" type="video/mp4" />
    </video>
    <video onclick="play()">
        <source src="./dizzy.mp4" type="video/mp4" />
    </video>
</body>
</html>

如果点击第一个视频元素,则视频文件正在从 Internet 下载,一切正常。但是在单击第二个(本地视频)后,只会出现一个带有“正在打开...”标签的视频播放器屏幕。两个视频是同一个视频文件。

该应用程序在模拟器和真实设备上运行(诺基亚 Lumnia 710 和 WF7.5 Mango),结果是一样的。

我尝试为视频文件设置不同的构建操作:内容、资源、嵌入式资源。没用。

如何让它发挥作用?

更新:描述了一个类似的问题here。是 WP7 的错误吗?

【问题讨论】:

100% 不是 WP7 错误。它是一个 Phonegap 甚至 HTML5 错误。 【参考方案1】:

这是一种解决方法。以下代码是实现视频播放功能的 Phonegap 命令。

using System;
using System.IO;
using System.IO.IsolatedStorage;
using System.Runtime.Serialization;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Phone.Controls;
using WP7GapClassLib.PhoneGap;
using WP7GapClassLib.PhoneGap.Commands;
using WP7GapClassLib.PhoneGap.JSON;

namespace PhoneGap.Extension.Commands


    /// <summary>
    /// Implements video play back functionality.
    /// </summary>
    public class Video : BaseCommand
    

        /// <summary>
        /// Video player object
        /// </summary>
        private MediaElement _player;

        [DataContract]
        public class VideoOptions
        
            /// <summary>
            /// Path to video file
            /// </summary>
            [DataMember(Name = "src")]
            public string Src  get; set; 
        

        public void Play(string args)
        
            VideoOptions options = JsonHelper.Deserialize<VideoOptions>(args);

            Deployment.Current.Dispatcher.BeginInvoke(() =>
            
                try
                
                    _Play(options.Src);

                    DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
                
                catch (Exception e)
                
                    DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
                
            ); 
        

        private void _Play(string filePath)
        
            // this.player is a MediaElement, it must be added to the visual tree in order to play
            PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
            if (frame != null)
            
                PhoneApplicationPage page = frame.Content as PhoneApplicationPage;
                if (page != null)
                
                    Grid grid = page.FindName("LayoutRoot") as Grid;
                    if (grid != null && _player == null)
                    
                        _player = new MediaElement();
                        grid.Children.Add(this._player);
                        _player.Visibility = Visibility.Visible;
                    
                
            

            Uri uri = new Uri(filePath, UriKind.RelativeOrAbsolute);
            if (uri.IsAbsoluteUri)
            
                _player.Source = uri;
            
            else
            
                using (IsolatedStorageFile isoFile = IsolatedStorageFile.GetUserStoreForApplication())
                
                    if (isoFile.FileExists(filePath))
                    
                        using (
                            IsolatedStorageFileStream stream = new IsolatedStorageFileStream(filePath, FileMode.Open,
                                                                                             isoFile))
                        
                            _player.SetSource(stream);
                        
                    
                    else
                    
                        throw new ArgumentException("Source doesn't exist");
                    
                
            

            _player.Play();
        
    


这里只有播放功能,但可以扩展支持停止/暂停/关闭等。

在客户端注册此命令:

    <script type="text/javascript">

    function playVideo(src) 

        PhoneGap.exec(         //PhoneGap.exec = function(success, fail, service, action, args)
            null, //success
            null, //fail
            "Video", //service
            "Play", //action
            src: src //args
           ); 
    ;
   </script>

播放文件:

<a href="#" class="btn" onClick="playVideo('/app/www/dizzy.mp4');">Play</a>  

注意路径'/app/www/dizzy.mp4'。

【讨论】:

嗨 Andrei Schneider,我对您的解决方法有疑问。你在哪里保存视频?您是否将它们复制到隔离存储中?还是您应用的 www 文件夹中的视频?你究竟是如何将你的插件实现到项目中的?我已将视频保存在应用程序中并使用您的代码,但是在调用 phonegap.exec(...) 时代码失败。如果你能回答问题,那就太棒了!提前致谢。 嘿 DrLudwig3,查看您的 Phonegap 项目中的 GapSourceDictionary.xml 文件。它包含一个文件列表。 PGView 类中有一个 GapBrowser_Loaded 方法。在这个方法中 GapSourceDictionary.xml 被加载、解析。并且文件被加载到独立存储中。 如果您愿意,请留下您的电子邮件。我将在接下来的 12 小时内将我的测试项目的源代码发送给您。【参考方案2】:

我用PhoneGap在android平台上实现了播放音乐的功能,我的代码截图如下: HTML 代码:

<a href="#" class="btn large" onclick="playAudio('/android_asset/www/music/noya_wyt.mp3');">Play Audio</a>

JavaScript 代码:

 function playAudio(src) 
        // Create Media object from src
        my_media = new Media(src, onSuccess, onError);

        // Play audio
        my_media.play();
 

我认为您可以更改视频“src”路径,然后重试。如果app还是不行,可以尝试调用phonegap media API实现。

【讨论】:

以上是关于如何在 WP7 - Phonegap 中播放嵌入的视频?的主要内容,如果未能解决你的问题,请参考以下文章

在 WP7 PhoneGap (Cordova) 应用程序 (v1.5) 中使用 $.getJSON

用户单击图标时如何在wp7中播放声音

如何防止我的 Phonegap 应用在 ios 上全屏播放视频?

在 wp7 中的特定时间播放声音

音乐重复时 WP7 XNA 游戏“断断续续”

WP7播放音频课程[关闭]