简体   繁体   English

HTML5<video> Android 上的元素

[英]HTML5 <video> element on Android

According to:根据:

http://developer.android.com/sdk/android-2.0-highlights.htmlhttp://developer.android.com/sdk/android-2.0-highlights.html

Android 2.0 should support the HTML5 video element. Android 2.0 应该支持 HTML5 视频元素。 I haven't been able to get this to work using a Motorola Droid, and haven't been able to successfully view a video on any of the HTML5 video example pages out there.我无法使用摩托罗拉 Droid 使其工作,并且无法成功查看任何 HTML5 视频示例页面上的视频。 Since there currently isn't support for QuickTime or Flash, this is the only other thing I can think of for embedding mp4 video in a web page.由于目前不支持 QuickTime 或 Flash,这是我能想到的在网页中嵌入 mp4 视频的唯一其他方法。 Has anyone had any luck with this?有没有人有这方面的运气?

I've just done some experimentation with this, and from what I can tell you need three things:我刚刚对此做了一些实验,据我所知,您需要三件事:

  1. You must not use the type attribute when calling the video.调用视频时不得使用type属性。
  2. You must manually call video.play()您必须手动调用 video.play()
  3. The video must be encoded to some quite strict parameters;视频必须编码为一些非常严格的参数; using the iPhone setting on Handbrake with the 'Web Optimized' button checked usually does the trick.使用 iPhone 上的 Handbrake 设置并选中“Web Optimized”按钮通常可以解决问题。

Have a look at the demo on this page: http://broken-links.com/tests/video/看看这个页面上的演示: http : //broken-links.com/tests/video/

This works, AFAIK, in all video-enabled desktop browsers, iPhone and Android. AFAIK,这适用于所有支持视频的桌面浏览器、iPhone 和 Android。

Here's the markup:这是标记:

<video id="video" autobuffer height="240" width="360">
<source src="BigBuck.m4v">
<source src="BigBuck.webm" type="video/webm">
<source src="BigBuck.theora.ogv" type="video/ogg">
</video>

And I have this in the JS:我在 JS 中有这个:

var video = document.getElementById('video');
video.addEventListener('click',function(){
  video.play();
},false);

I tested this on a Samsung Galaxy S and it works fine.我在三星 Galaxy S 上对此进行了测试,效果很好。

Roman's answer worked fine for me - or at least, it gave me what I was expecting.罗曼的回答对我来说很好 - 或者至少,它给了我我所期待的。 Opening the video in the phone's native application is exactly the same as what the iPhone does.在手机的原生应用中打开视频和在 iPhone 上是完全一样的。

It's probably worth adjusting your viewpoint and expect video to be played fullscreen in its own application, and coding for that.可能值得调整您的观点并期望视频在其自己的应用程序中全屏播放,并为此编码。 It's frustrating that clicking the video isn't sufficient to get it playing in the same way as the iPhone does, but seeing as it only takes an onclick attribute to launch it, it's not the end of the world.令人沮丧的是,点击视频并不足以让它以与 iPhone 相同的方式播放,但看到它只需要一个 onclick 属性来启动它,这并不是世界末日。

My advice, FWIW, is to use a poster image, and make it obvious that it will play the video.我的建议,FWIW,是使用海报图像,并明确它会播放视频。 I'm working on a project at the moment that does precisely that, and the clients are happy with it - and also that they're getting the Android version of a web app for free, of course, because the contract was only for an iPhone web app.我目前正在开展一个项目,正好做到了这一点,客户对此很满意——当然,他们还免费获得了 Android 版本的网络应用程序,因为合同仅用于iPhone 网络应用程序。

Just for illustration, a working Android video tag is below.只是为了说明,下面是一个有效的 Android 视频标签。 Nice and simple.好看又简单。

<video src="video/placeholder.m4v" poster="video/placeholder.jpg" onclick="this.play();"/>

Here I include how a friend of mine solved the problem of displaying videos in HTML in Nexus One:在这里我介绍一下我的一个朋友是如何解决 Nexus One 中显示 HTML 格式视频的问题的:

I never was able to make the video play inline.我从来没有能够让视频在线播放。 Actually many people on the internet mention explicitly that inline video play in HTML is supported since Honeycomb, and we were fighting with Froyo and Gingerbread... Also for smaller phones I think that playing full screen is very natural - otherwise not so much is visible.实际上,互联网上很多人都明确提到自 Honeycomb 以来支持 HTML 中的内联视频播放,而我们正在与 Froyo 和 Gingerbread 作斗争......对于较小的手机,我认为全屏播放是很自然的 - 否则看不到那么多. So the goal was to make the video open in full screen.所以目标是让视频全屏打开。 However, the proposed solutions in this thread did not work for us - clicking on the element triggered nothing.但是,该线程中提出的解决方案对我们不起作用 - 单击元素不会触发任何内容。 Furthermore the video controls were shown, but no poster was displayed so the user experience was even weirder.此外,显示了视频控件,但没有显示海报,因此用户体验更加奇怪。 So what he did was the following:所以他做了以下事情:

Expose native code to the HTML to be callable via javascript:将本机代码公开给 HTML 以便通过 javascript 调用:

JavaScriptInterface jsInterface = new JavaScriptInterface(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(jsInterface, "JSInterface");

The code itself, had a function that called native activity to play the video:代码本身有一个调用本机活动来播放视频的函数:

public class JavaScriptInterface {
    private Activity activity;

    public JavaScriptInterface(Activity activiy) {
        this.activity = activiy;
    }

    public void startVideo(String videoAddress){
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.parse(videoAddress), "video/3gpp"); // The Mime type can actually be determined from the file
        activity.startActivity(intent);
    }
}

Then in the HTML itself he kept on failing make the video tag work playing the video.然后在 HTML 本身中,他一直未能使视频标签正常播放视频。 Thus, finally he decided to overwrite the onclick event of the video, making it do the actual play.因此,最后他决定覆盖视频的onclick事件,使其进行实际播放。 This almost worked for him - except for no poster was displayed.这几乎对他有用 - 除了没有显示海报。 Here comes the most weird part - he kept on receiving ERROR/AndroidRuntime(7391): java.lang.RuntimeException: Null or empty value for header "Host" every time he set the poster attribute of the tag.这是最奇怪的部分 - 每次他设置标签的poster属性时,他都会收到ERROR/AndroidRuntime(7391): java.lang.RuntimeException: Null or empty value for header "Host" Finally he found the issue, which was very weird - it turned out that he had kept the source subtag in the video tag, but never used it.最后他发现了这个问题,这很奇怪——原来他把source子标签保留在video标签中,但从未使用过。 And weird enough exactly this was causing the problem.很奇怪,这正是导致问题的原因。 Now see his definition of the video section:现在看他对video部分的定义:

<video width="320" height="240" controls="controls" poster='poster.gif'  onclick="playVideo('file:///sdcard/test.3gp');" >
   Your browser does not support the video tag.
</video>

Of course you need to also add the definition of the javascript function in the head of the page:当然你还需要在页面头部添加javascript函数的定义:

<script>
  function playVideo(video){
    window.JSInterface.startVideo(video);
  }
</script>

I realize this is not purely HTML solution, but is the best we were able to do for Nexus One type of phone.我意识到这不是纯粹的 HTML 解决方案,而是我们能够为 Nexus One 类型的手机做的最好的解决方案。 All credits for this solution go to Dimitar Zlatkov Dimitrov.此解决方案的所有功劳都归于 Dimitar Zlatkov Dimitrov。

If you manually call video.play() it should work:如果您手动调用video.play()它应该可以工作:

<!DOCTYPE html>
<html>
<head>
  <script>
    function init() {
      enableVideoClicks();
    }

    function enableVideoClicks() {
      var videos = document.getElementsByTagName('video') || [];
      for (var i = 0; i < videos.length; i++) {
        // TODO: use attachEvent in IE
        videos[i].addEventListener('click', function(videoNode) {
          return function() {
            videoNode.play();
          };
        }(videos[i]));
      }
    }
  </script>
</head>
<body onload="init()">

  <video src="sample.mp4" width="400" height="300" controls></video>

  ...

</body>
</html>

pointing my android 2.2 browser to html5test.com , tells me that the video element is supported, but none of the listed video codecs... seems a little pointless to support the video element but no codecs???将我的 android 2.2 浏览器指向html5test.com ,告诉我支持视频元素,但没有列出的视频编解码器......支持视频元素但没有编解码器似乎有点毫无意义??? unless there is something wrong with that test page.除非那个测试页有问题。

however, i did find the same kind of situation with the audio element: the element is supported, but no audio formats.但是,我确实发现了与音频元素相同的情况:支持该元素,但不支持音频格式。 see here:看这里:

http://textopiablog.wordpress.com/2010/06/25/browser-support-for-html5-audio/ http://textopiablog.wordpress.com/2010/06/25/browser-support-for-html5-audio/

Nothing worked for me until I encoded the video properly.在我正确编码视频之前,没有什么对我有用。 Try this guide for the correct handbrake settings: http://forum.handbrake.fr/viewtopic.php?f=7&t=9694试试本指南以获得正确的手刹设置: http : //forum.handbrake.fr/viewtopic.php? f=7&t= 9694

Maybe you have to encode the video specifically for the device eg:也许您必须专门为设备编码视频,例如:

<video id="movie" width="320" height="240" autobuffer controls>
  <source src="pr6.ogv" type='video/ogg; codecs="theora, vorbis"'>
  <source src="pr6.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
<source src="pr6.mp4" type='video/mp4; codecs="some droid video codec, some droid audio codec"'>
</video>

There are some examples of encoding configurations that worked on here:这里有一些编码配置的例子:

https://supportforums.motorola.com https://supportforums.motorola.com

Try h.264 in an mp4 container.在 mp4 容器中尝试 h.264。 I've had much success with it on my Droid X. I've been using zencoder.com for format conversions.我在我的 Droid X 上使用它取得了很大的成功。我一直在使用 zencoder.com 进行格式转换。

This works for me:这对我有用:

<video id="video-example" width="256" height="177" poster="image.jpg">
<source src="video/video.mp4" type="video/mp4"></source>
<source src="video/video.ogg" type="video/ogg"></source>
This browser does not support HTML5
</video>

Only when the .mp4 is on top and the videofile is not to big.仅当 .mp4 位于顶部且视频文件不大时。

It's supposed to work, but watch the resolution: Android 2.0 and webkit它应该可以工作,但请注意分辨率: Android 2.0 和 webkit

Canvas works right out of the box, while Geolocation seems to not work at all in the Emulator. Canvas 开箱即用,而 Geolocation 在模拟器中似乎根本不起作用。 Of course, I have to send it mock locations to get it to work, so I have no idea what this would be like on an actual phone.当然,我必须向它发送模拟位置才能使其工作,所以我不知道在实际手机上会是什么样子。 I can say the same thing with the video tag.我可以对视频标签说同样的话。 There are issues with it not actually playing the video, BUT I think it's the fact that the video is a higher resolution than what the Emulator can handle.它实际上没有播放视频存在问题,但我认为视频的分辨率高于模拟器可以处理的分辨率。 We'll know more once someone tries this on a Motorola Droid or other next-gen Android device一旦有人在摩托罗拉 Droid 或其他下一代 Android 设备上尝试此操作,我们就会知道更多

This might not exactly answer your question, but we're using the 3GP or 3GP2 file format.这可能不能完全回答您的问题,但我们使用的是 3GP 或 3GP2 文件格式。 Better even to use the rtsp protocol, but the Android browser will also recognize the 3GP file format.甚至使用 rtsp 协议更好,但 Android 浏览器也会识别 3GP 文件格式。

You can use something like你可以使用类似的东西

self.location = URL_OF_YOUR_3GP_FILE

to trigger the video player.触发视频播放器。 The file will be streamed and after playback ends, handling is returned to the browser.文件将被流式传输,播放结束后,处理返回给浏览器。

For me this solves a lot of problems with current video tag implementation on android devices.对我来说,这解决了 Android 设备上当前视频标签实现的很多问题。

According to : https://stackoverflow.com/a/24403519/365229根据: https : //stackoverflow.com/a/24403519/365229

This should work, with plain Javascript:这应该可以工作,使用纯 Javascript:

 var myVideo = document.getElementById('myVideoTag'); myVideo.play(); if (typeof(myVideo.webkitEnterFullscreen) != "undefined") { // This is for Android Stock. myVideo.webkitEnterFullscreen(); } else if (typeof(myVideo.webkitRequestFullscreen) != "undefined") { // This is for Chrome. myVideo.webkitRequestFullscreen(); } else if (typeof(myVideo.mozRequestFullScreen) != "undefined") { myVideo.mozRequestFullScreen(); }

You have to trigger play() before the fullscreen instruction, otherwise in Android Browser it will just go fullscreen but it will not start playing.您必须在全屏指令之前触发 play() ,否则在 Android 浏览器中它只会全屏显示但不会开始播放。 Tested with the latest version of Android Browser, Chrome, Safari.使用最新版本的 Android 浏览器、Chrome、Safari 进行测试。

I've tested it on Android 2.3.3 & 4.4 browser.我已经在 Android 2.3.3 & 4.4 浏览器上测试过了。

After much research, in many different devices, up to now, I've reached the simple conclusion that MP4 is much less supported than MOV format.经过大量研究,在许多不同的设备中,到目前为止,我得出了一个简单的结论,即MP4支持远不如MOV格式。 So, I'm using MOV format, which is supported by all Android and Apple devices, on all browsers.因此,我在所有浏览器上使用所有 Android 和 Apple 设备都支持的MOV格式。 I've detected weather the device is a mobile device or a desktop browser, and set the SRC accordingly:我检测到设备是移动设备或桌面浏览器的天气,并相应地设置SRC

if (IsMobile()) {
    $('#vid').attr('src', '/uploads/' + name + '.mov');
}
else {
    $('#vid').attr('src', '/uploads/' + name + '.webm');        
}

function IsMobile() {
    var isMobile = false; //initiate as false

    if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent)
                || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0, 4))) isMobile = true;
    return isMobile;
}

I tried using the .mp4 format to play a video on Android devices but that did not go well.我尝试使用.mp4格式在 Android 设备上播放视频,但效果不佳。 So after some trial and error, I converted the video into the .webm format and following code with no extra javascript or JQuery:因此,经过反复试验,我将视频转换为.webm格式和以下代码,没有额外的 javascript 或 JQuery:

<video id="video" class="video" muted loop autoplay>
    <source src="../media/some_video.webm" type="video/webm">
    Sorry, your browser doesn't support embedded videos.
</video>

It worked on an older Android device (at least a few years old as of 2020).它适用于较旧的 Android 设备(截至 2020 年至少已有几年历史)。

HTML5 is supported on both Google (android) phones such as Galaxy S, and iPhone. HTML5 在 Google (android) 手机(例如 Galaxy S)和 iPhone 上均受支持。 iPhone however doesn't support Flash, which Google phones do support.但是 iPhone 不支持 Flash,而 Google 手机确实支持 Flash。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM