在适用于 Android、IOS 和桌面设备的 Cordova 应用程序中播放音频和视频
Play audio and video in Cordova application which works in Android, IOS and desktop devices
我需要在我的混合应用程序中播放音频和视频,它应该可以在 Android、IOS 和 windows 桌面上运行。应用程序构建在 JQuery Mobile 之上,并使用 Cordova for Mobile 封装。
HTML5 视频标签在浏览器中有效,但在 Android 中无效。我浏览并发现了几个特定于平台 (Android) 的插件,我们必须在其中添加代码。java 文件,我不想这样做。
<video width="350" height="150" controls>
<source type="video/m4v" src="http://techslides.com/demos/sample-videos/small.mp4" >
</video>
我还查看了 Cordova 的媒体 API,我发现它适用于音频 (http://cordova.apache.org/docs/en/2.4.0/cordova_media_media.md.html)。
有什么方法可以在 Android、IOS 和桌面浏览器中播放音频和视频。
经过数小时的查找问题后,此解决方案适用于 iOS 和 Android 上的桌面和移动浏览器以及 Cordova。它解决了以下发现:
- 在 iOS 上,
<audio>
有效,但没有音量控制。
- 在 Android 上,
<audio>
不起作用,需要 Media 插件。
- 在 iOS 上,
<audio>
元素的 src 属性可用于 Media 对象,在 Android 上,js Audio 对象的 src 属性 有效。
- 必须在play()之后直接调用setVolume()方法才能生效
- 在 Android,从未调用媒体事件处理程序。这很糟糕,因为根据documentation,播放后应该调用release()方法。 此问题尚无解决方案。
该示例有一个静态音频元素,其 src 路径相对于 index.html,位于 Cordova 的 www 文件夹中。在启动时,脚本会检查 Cordova 并设置 DeviceReady 处理程序(如果是)。然后找到音频元素并通过 playAudio().
播放
HTML头:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *">
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1">
<title>Audio Example</title>
<script src="cordova.js"></script>
<script>
var config = {
audioVolume: 0.25
}
// Use onDeviceReady if we run in Cordova
window.addEventListener('load', function(){
if (window.Cordova) {
console.log("Cordova found");
document.addEventListener('DeviceReady', start, false);
} else {
console.log("Cordova not found, using pure html audio")
start();
}
}, false);
function start() {
var audioElement = document.querySelector("audio");
playAudio(audioElement);
}
function playAudio(ae) {
var source, me, successFunction, onSuccess, onError;
onSuccess = function() {
console.log('Playing ' + ae.src + ' at volume ' + config.audioVolume);
me.release();
}
onError = function(e) {
console.log('ERROR on playing ' + ae.src + ' at volume ' + config.audioVolume
+ ': (' + e.code + ') ' + e.message);
}
onStatusChange = function(s){
console.log('Media status changed to ' + s);
if (s === Media.MEDIA_STOPPED) onSuccess();
}
// If running in Cordova and Media plugin loaded, use that
if (typeof Media === "function") {
source = device.platform === 'iOS'
? ae.getAttribute('src') // relative path
: ae.src; // file-url, platform-dependant
me = new Media(source, onSuccess, onError, onStatusChange);
me.play();
me.setVolume(config.audioVolume);
} else {
ae.volume = config.audioVolume;
ae.play();
}
}
</script>
HTML正文:
<audio src="sounds/mysound.mp3"></audio>
我需要在我的混合应用程序中播放音频和视频,它应该可以在 Android、IOS 和 windows 桌面上运行。应用程序构建在 JQuery Mobile 之上,并使用 Cordova for Mobile 封装。
HTML5 视频标签在浏览器中有效,但在 Android 中无效。我浏览并发现了几个特定于平台 (Android) 的插件,我们必须在其中添加代码。java 文件,我不想这样做。
<video width="350" height="150" controls>
<source type="video/m4v" src="http://techslides.com/demos/sample-videos/small.mp4" >
</video>
我还查看了 Cordova 的媒体 API,我发现它适用于音频 (http://cordova.apache.org/docs/en/2.4.0/cordova_media_media.md.html)。
有什么方法可以在 Android、IOS 和桌面浏览器中播放音频和视频。
经过数小时的查找问题后,此解决方案适用于 iOS 和 Android 上的桌面和移动浏览器以及 Cordova。它解决了以下发现:
- 在 iOS 上,
<audio>
有效,但没有音量控制。 - 在 Android 上,
<audio>
不起作用,需要 Media 插件。 - 在 iOS 上,
<audio>
元素的 src 属性可用于 Media 对象,在 Android 上,js Audio 对象的 src 属性 有效。 - 必须在play()之后直接调用setVolume()方法才能生效
- 在 Android,从未调用媒体事件处理程序。这很糟糕,因为根据documentation,播放后应该调用release()方法。 此问题尚无解决方案。
该示例有一个静态音频元素,其 src 路径相对于 index.html,位于 Cordova 的 www 文件夹中。在启动时,脚本会检查 Cordova 并设置 DeviceReady 处理程序(如果是)。然后找到音频元素并通过 playAudio().
播放HTML头:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *">
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1">
<title>Audio Example</title>
<script src="cordova.js"></script>
<script>
var config = {
audioVolume: 0.25
}
// Use onDeviceReady if we run in Cordova
window.addEventListener('load', function(){
if (window.Cordova) {
console.log("Cordova found");
document.addEventListener('DeviceReady', start, false);
} else {
console.log("Cordova not found, using pure html audio")
start();
}
}, false);
function start() {
var audioElement = document.querySelector("audio");
playAudio(audioElement);
}
function playAudio(ae) {
var source, me, successFunction, onSuccess, onError;
onSuccess = function() {
console.log('Playing ' + ae.src + ' at volume ' + config.audioVolume);
me.release();
}
onError = function(e) {
console.log('ERROR on playing ' + ae.src + ' at volume ' + config.audioVolume
+ ': (' + e.code + ') ' + e.message);
}
onStatusChange = function(s){
console.log('Media status changed to ' + s);
if (s === Media.MEDIA_STOPPED) onSuccess();
}
// If running in Cordova and Media plugin loaded, use that
if (typeof Media === "function") {
source = device.platform === 'iOS'
? ae.getAttribute('src') // relative path
: ae.src; // file-url, platform-dependant
me = new Media(source, onSuccess, onError, onStatusChange);
me.play();
me.setVolume(config.audioVolume);
} else {
ae.volume = config.audioVolume;
ae.play();
}
}
</script>
HTML正文:
<audio src="sounds/mysound.mp3"></audio>