HTML5 video posterini videonun kendisiyle aynı boyutta yapın


96

HTML5 video posterini videonun tam boyutlarına tam olarak uyacak şekilde yeniden boyutlandırmayı bilen var mı?

sorunu gösteren bir jsfiddle: http://jsfiddle.net/zPacg/7/

işte o kod:

HTML:

<video controls width="100%" height="100%"  poster="http://www.wpclipart.com/blanks/buttons/glossy_buttons/glossy_button_blank_orange_rectangle.png">
  <source src="http://demo.inwebson.com/html5-video/iceage4.mp4" type="video/mp4" />
  <source src="http://demo.inwebson.com/html5-video/iceage4.ogg" type="video/ogg" />
  <source src="http://demo.inwebson.com/html5-video/iceage4.webm" type="video/webm" />
</video>​

CSS:

video{
border:1px solid red;
}​

Turuncu dikdörtgenin videonun kırmızı kenarlığına ölçeklenmediğine dikkat edin.

Ayrıca, yalnızca aşağıdaki CSS'yi eklemek, videoyu posterle birlikte yeniden ölçeklendirdiğinden çalışmaz:

video[poster]{
height:100%;
width:100%;
}

1
özniteliklerde "%" kullanabileceğinizi sanmıyorum; ancak 100 olarak değiştirmek sorunu çözmez. Onun -webkit medya tarzına emin olacağım. aralarından seçim yapmaktan çekinmeyin trac.webkit.org/browser/trunk/Source/WebCore/css/…
albert

@albert, teşekkürler, postergönderdiğiniz bağlantıda herhangi bir referans göremiyorum . Bana bahsettiğiniz şey için CSS'nin neye benzediğini gösterebilir misiniz, örneğin " -webkit media style"? teşekkürler
tim peterson

"seçmek" ile kastettiğim buydu; bunlar chrome'a ​​özgü ortam stilleridir; ilan ettikleri sözde seçiciler bir yana, onlara sadece belli belirsiz aşinayım; başlangıç ​​noktası olmadan: dolgu vb. içeren bildirimleri
arardım

Yanıtlar:


52

Bunu başarmak için şeffaf bir poster görüntüsünü bir CSS arka plan görüntüsü ile birlikte kullanabilirsiniz ( örnek ); ancak, bir videonun yüksekliğine ve genişliğine kadar uzatılmış bir arka plana sahip olmak için, mutlak konumlandırılmış bir <img>etiket ( örnek ) kullanmanız gerekir.

Da mümkündür ayarlamak background-sizeiçin100% 100% de destek olduğu tarayıcılardabackground-size ( örneğin ).


Güncelleme

Bunu yapmanın daha iyi bir yolu, object-fitCSS özelliğini @Lars Ericsson'un önerdiği gibi kullanmak olacaktır .

Kullanım

object-fit: cover;

Görüntünün videonun en boy oranına uymayan kısımlarını görüntülemek istemiyorsanız ve

object-fit: fill;

görüntüyü videonuzun en boy oranına uyacak şekilde uzatmak için

Misal


- @ user1419007, örneğiniz arka plan resmini tekrarlıyor. Bunun en iyi yol olmadığını söylediğinize göre, 2. stratejinizi nasıl uygulayacağınızı gösteren bir jsfiddle sağlar mısınız?
tim peterson

Ben ettik no-repeatarka plan görüntüsü ed. Diğer çözüme gelince, bunu halletmem için bana biraz zaman verin.
user2428118

Düzenleme: önerilen ikinci çözüm için örnek eklendi.
user2428118

bunun için teşekkürler z-index, videoyu oynatmaya başladığınızda görünecek şekilde görüntüyü değiştirmek için biraz javascript'e ihtiyacımız var.
tim peterson

2
.. ikinci örnek chrome'da çalışmadı mı? dış div'e jsfiddle.net/xh8er gibi bir konum vermeniz gerekir ; sonra çalışır.
commonpike

88

Hangi tarayıcıları hedeflediğinize bağlı olarak, bunu çözmek için object-fit özelliğini kullanabilirsiniz:

object-fit: cover;

veya belki fillde aradığınız şeydir. Hala IE için düşünülüyor .


3
Cevap kesinlikle budur.
cilphex

1
Object-fit özelliğine bağlantı için +1 , kullanma object-fit: initialbenim için yaptı.
FireBrand

"object-fit: fill" hile yaptı! "object-fit: initial" olduğu gibi (tuhaf bir şekilde, developer.mozilla.org/en-US/docs/Web/CSS/object-fit adresindeki spesifikasyonda bir "başlangıç" değeri göremiyorum ). Hem "kapak" hem de "içerme", Samsung yerel tarayıcısında android 5.1.1 altında oynatılan posteri bozdu. Ve IE'yi etkilemiyor!
plugincontainer

1
Nesne uygunluk kuralı için hangi css seçiciyi hedeflediniz? Poster görüntüsünü hedeflemenin bir yolu olmadığına göre, kullandığınızı varsayıyorum video{object-fit: cover;}?
zıəs

@ zıəs uɐɟəʇs css'imde ... video [poster] {object-fit: fill}
plugincontainer

27

Veya preload="none"VİDEO arka planını görünür kılmak için özniteliği kullanabilirsiniz . Ve background-size: cover;burada kullanabilirsiniz .

 video {
   background: transparent url('video-image.jpg') 50% 50% / cover no-repeat ;
 }

 <video preload="none" controls>
   <source src="movie.mp4" type="video/mp4">
   <source src="movie.ogg" type="video/ogg">
 </video>

2
daha iyi cevap. hiçbir şeyi bozmaz ve bir videoyu önceden yüklememek, video merkezli bir site olmadığı sürece sayfanıza gerçekten zarar vermez. +1.
totalNotLizards

1
Cep telefonlarında oyun sırasında arka planı yeniden boyutlandırdım. Buradaki diğer sorulardan / yanıtlardan (örneğin, stackoverflow.com/questions/18229974/… ), sorunun görüntülerin kopyası olduğu görülmektedir (oynatıcı css arka planı ve video öğesi posteri). Bu düzeltme işe yaradı.
plugincontainer

1
Hmm ... Chrome'da çalıştı ancak yerel Android tarayıcısında yeni bir sorun yarattı. Bakınız: stackoverflow.com/questions/39546792/…
plugincontainer

Sonunda düzeltildi - aşağıdaki Lars Ericsson cevabına bakın
plugincontainer

27

Bununla uğraşıyordum ve tüm çözümleri denedim, sonunda kullandığım çözüm Google Chrome'un Müfettişinden bir öneriydi. Bunu CSS'nize eklerseniz, benim için çalıştı:

video{
   object-fit: inherit;
}

Teşekkür ederim! Bu, üstteki ve alttaki video boşluğunu ortadan kaldırmak için aradığım kesin
çözümdü

12

Çözümüm, user2428118 ve Veiko Jääger'in yanıtlarını birleştirerek, ayrı bir şeffaf görüntü gerektirmeden önceden yüklemeye izin veriyor. Bunun yerine, base64 kodlu 1px şeffaf resim kullanıyoruz.

<style type="text/css" >
    video{
        background: transparent url("poster.jpg") 50% 50% / cover no-repeat ;
    }
</style>
<video controls poster="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" >
    <source src="movie.mp4" type="video/mp4">
    <source src="movie.ogg" type="video/ogg">
</video>

Yalnızca görüntü adı mı yoksa tam yol mu olması gerekiyor?

Samsung'umdaki android yerel tarayıcısında (tarayıcı "İnternet" olarak adlandırılır) poster, oynatılırken ... felaket bir şekilde yeniden boyutlandırıldı. Bu çözüm - poster olarak şeffaf bir gif ve arka plan olarak "poster" - bunu çözdü, ANCAK .. şimdi poster IE-9, 10 veya 11'de gösterilmiyor
plugincontainer

1
Çözüm, şeffaf gif ve arka plan olarak posteri terk etmek ve (yukarıdaki Lars Ericsson cevabına bakın) video [poster] {object-fit: fill} kullanmaktı. Android 5.1.1 altında Samsung yerel tarayıcısında çözülen sorun. ve IE sorunsuz bir poster görüntüler
plugincontainer

Bu yaklaşım, özellikle mobil cihazlar için daha iyidir. içerik hala yüklenirken Android'de meydana object-fitgelen vahşi boyut bozulmalarını engellemez poster.
TheLinguist

5

Bu fikir aklıma geldi ve mükemmel çalışıyor. Tamam, temelde videodan ilk kareden kurtulmak ve ardından posteri videoların gerçek boyutuna yeniden boyutlandırmak istiyoruz. Daha sonra boyutları belirlersek, bu görevlerden birini tamamlamış oluruz. O zaman geriye sadece biri kalır. Şimdi, ilk kareden kurtulmanın tek yolu aslında bir poster tanımlamaktır. Ancak, videoya var olmayan sahte bir tane vereceğiz. Bu, arka plan şeffaf olan boş bir ekrana neden olacaktır. Yani ana div'inizin arka planı görünür olacaktır.

Kullanımı basit, ancak kodum "arka plan boyutu" kullandığından div'in arka planının boyutunu videonun boyutuna göre yeniden boyutlandırmak isterseniz tüm web tarayıcılarında çalışmayabilir.

HTML / HTML5:

<div class="video_poster">
    <video poster="dasdsadsakaslmklda.jpg" controls>
        <source src="videos/myvideo.mp4" type="video/mp4">
        Your browser does not support the video tag.
    </video>
<div>

CSS:

video{
    width:694px;
    height:390px;
}
.video_poster{
    width:694px;
    height:390px;
    background-size:694px 390px;
    background-image:url(images/myvideo_poster.jpg);
}

bu akıllıca, bir şans verdim. Mükemmel değil ama oraya ulaşmak
tim peterson

Evet haklısın. Jsfiddle'ınıza bakarak, artık videonun boyutunun da doğru olması gerektiğini ve sadece video öğesi olmadığını anlıyorum. Sanırım sayfamda denediğimde sadece şanslıydım.
Jonathan J

5
<video src="videofile.webm" poster="posterimage.jpg" controls preload="metadata">
    Sorry, your browser doesn't support embedded videos.
</video>

Örtmek

video{
   object-fit: cover; /*to cover all the box*/
}

Doldur

video{
   object-fit: fill; /*to add black content at top and bottom*/
   object-position: 0 -14px; /* to center our image*/
}

Video kontrollerinin resmimizin üzerinde olduğunu , dolayısıyla resmimizin tam olarak gösterilmediğini unutmayın. Nesne sığdırmalı kapak kullanıyorsanız, görselinizi photoshop olarak görsel bir uygulamada düzenleyin ve alt içerik kenar boşluğu ekleyin.


1

Benzer bir sorunla karşılaştım ve videomla aynı en boy oranına (16: 9) sahip bir görüntü oluşturarak bu sorunu düzelttim. Genişliğim video etiketinde% 100 olarak ayarlandı ve şimdi resim (320 x 180) mükemmel bir şekilde uyuyor. Umarım yardımcı olur!


1

Başparmak oluşturduktan sonra görüntü boyutunu yeniden boyutlandırabilirsiniz

exec("ffmpeg -i $video_image_dir/out.png -vf scale=320:240 {$video_image_dir}/resize.png",$out2, $return2);

1

Mobil cihazda (veya video otomatik oynatma işlevini desteklemeyen cihazlarda) video yerine resim göstermek için posteri kullanabilirsiniz. Çünkü mobil cihazlar video otomatik oynatma işlevini desteklemiyor.

<div id="wrap_video">
<video preload="preload" id="Video" autoplay="autoplay" loop="loop" poster="default.jpg">
<source src="Videos.mp4" type="video/mp4">
Your browser does not support the <code>video</code> tag.
</video>
</div>

Artık, mobil cihaz için video etiketinin içindeki poster niteliğini medya sorgusu aracılığıyla biçimlendirebilirsiniz.

#wrap_video
{
width:480px;
height:360px;
position: relative;
} 
@media (min-width:360px) and (max-width:780px)
{
video[poster]
{
top:0 !important;
left:0 !important;
width:480px !important;
height:360px !important;
position: absolute !important;
}
}

Aslında iOS 10+, playsinline özelliğiyle otomatik video oynatma işlevini destekler.
Lukas Petr

Bu niteliği nasıl belirliyorsunuz?
Khom Nazid

0
height:500px;
min-width:100%;
-webkit-background-size: 100% 100%;
-moz-background-size: 100% 100%;
-o-background-size: 100% 100%;
background-size:100% 100%;
object-fit:cover;

-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size:cover;

0

Bu çalıştı

<video class="video-box" poster="/" controls>
    <source src="some source" type="video/mp4">
</video>

Ve CSS

.video-box{
 background-image: 'some image';
 background-size: cover;
}

0
  <div class="container">
        <video poster="~/Content/WebSite/img/SiteSetting/Load.gif" autoplay muted loop class="myVideo">
            <source src="~/Content/WebSite/images/VideoTube.mp4" type="video/mp4" />
        </video>

    </div>



 <style>
    .myVideo {
position: absolute;
right: 0;
left: 0;
bottom: 0;
min-width: 100%;
min-height: 100%;
object-fit: inherit;
 }
@media only screen and (max-width:768px) {
.myVideo {
    position: absolute;
    right: 0;
    left: 0;
    bottom: 0;
    max-width: -webkit-fill-available;
    min-height: 100%;
    object-fit: cover;
    }
   }

     @media only screen and (max-width:320px) {
.myVideo {
    position: absolute;
    right: 0;
    left: 0;
    bottom: 0;
    max-width: -webkit-fill-available;
    min-height: 100%;
    object-fit: cover;
  }
}
</style>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.