2015-07-02 25 views
8

Bir YouTube videosu geniş ekranlıysa veya v3 API'sini kullanmıyorsa kesinlikle bilmek isterim. 4: 3 oranına sahip birçok eski video var, bu yüzden bunu tespit etmem gerekiyor.YouTube videosunun geniş ekran olup olmadığını belirleme

Bu API v2 ile mümkün, ancak şimdi resmen emekli oldu. İşte API v3 docs. Bu yöntem işe yaramazsa, böylece 3:

https://www.googleapis.com/youtube/v3/videos?id=[VIDEOID]&part=snippet&key=[DEVELOPERKEY] 

Ayrıca, küçük resim verileri her zaman 4 boyutlarını döndürür:

bir API çağrısı şuna benzer. İşte bir örnek:

[thumbnails] => Array 
(
    [default] => Array 
    (
     [url] => https://i.ytimg.com/vi/nnnnnnnnn/default.jpg 
     [width] => 120 
     [height] => 90 
    ) 
    ... 
) 

Herhangi bir fikrin var mı?

(Şu anda 4 gammaz siyah çubuklar küçük pikselleri analiz ederek bu hack değilim. 3 videolar olacaktır) İşte

4'te örnek bir video: 3 oranında:

https://www.youtube.com/watch?v=zMJ-Dl4eJu8 (eski dövüş sanatları video)

martial arts in 4:3

ve 16 yılında bir: 9:

https://www.youtube.com/watch?v=7O2Jqi-LhEI (yeni bir egzersiz Video)

workout video


Güncelleme: En umut verici öneri fileDetails.videoStreams[].aspectRatio keşfetmeye ama bu videonun sahibine kullanılabilir görünüyor. Aksi takdirde, fileDetails için

talebi isteme İstek, kullanıcı derecelendirme bilgilerine erişemez. istek düzgün

+0

En boy oranını özelleştirebileceğine emin misin? Sanırım tüm videolar 16: 9'a ayarlandı. – Halcyon

+0

@Halcyon Birçok eski video, standart en boy oranıdır. Bunu yakın zamana kadar v2 ile tespit edebilirim. – Drakes

+0

'fileDetails.videoStreams []. AspectRatio', video içeriğinin görüntülenecek en boy oranını belirten video içeriğinin ekran en boy oranını verir. – jdepypere

cevap

2

yetkisi yok çünkü API V3 dışındaki farklı bir yöntem kullanarak açıksan Bu hata oluşabilir, sonra ben onu oEmbed API ile mümkün olduğuna inanıyoruz.

http://www.youtube.com/oembed?url={VIDEO_URL}&format=json 

böylece gibi:

http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=zMJ-Dl4eJu8&format=json 

üretmek misiniz: Verdiğiniz örneklerde

{ 
    "provider_url":"https:\/\/www.youtube.com\/", 
    "thumbnail_url":"https:\/\/i.ytimg.com\/vi\/zMJ-Dl4eJu8\/hqdefault.jpg", 
    "thumbnail_height":360, 
    "height":344, 
    "type":"video", 
    "version":"1.0", 
    "html":"\u003ciframe width=\"459\" height=\"344\" src=\"https:\/\/www.youtube.com\/embed\/zMJ-Dl4eJu8?feature=oembed\" frameborder=\"0\" allowfullscreen\u003e\u003c\/iframe\u003e", 
    "author_name":"hadronica2", 
    "width":459, 
    "provider_name":"YouTube", 
    "author_url":"https:\/\/www.youtube.com\/user\/hadronica2", 
    "title":"Aikido - Kazuo Chiba sensei - 1\u00ba part", 
    "thumbnail_width":480 
} 

, çıkış aşağıdaki gibi olmuştur:

http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=zMJ-Dl4eJu8&format=json

http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=zMJ-Dl4eJu8&format=json

Width: 480 
Height: 270 
Ratio: w/h = 1.7777 = 16/9 

Bu Sağladığınız örneklerde çalışır gibi görünen.

0

İşten çıkarma API'sının v2 sürümünden beri kullandığım kısaltılmış sürüm.

Siyah çubukların olabileceği belirli bir videonun default.jpg küçük resminin üst ve alt kısmında birkaç nokta test eder. Bir üst noktadan dikey olarak zıt bir nokta, bu piksellerin, bir kaç delta dahilinde birbirine benzediğini görmek için test edilir. Bu birkaç nokta için tekrarlanır.

function isWidescreen($video = null) { 

    // LOGIC: 
    // 4:3 videos will have default.jpg with no top black bars 
    // 16:9 videos will have black top and bottom borders on default.jpg 

    // Get the default thumbnail (may have black bars on top and bottom) 
    $response = self::accessCurlObj()->get("https://i.ytimg.com/vi/{$video}/default.jpg"); 
    $defaultImgRes = imagecreatefromstring($response); 

    $samplePoints = array(array(20,2), array(40,4), array(60,6), array(80,8)); 

    // Scan a few points for equality between top and bottom 
    $height = imagesy($defaultImgRes); 
    foreach($samplePoints as $point) { 
     // Top 
     $rgbTop = imagecolorat($defaultImgRes, $point[0], $point[1]); 
     $colorsTop = imagecolorsforindex($defaultImgRes, $rgbTop); 

     // Bottom 
     $rgbBottom = imagecolorat($defaultImgRes, $point[0], $height - $point[1]); 
     $colorsBottom = imagecolorsforindex($defaultImgRes, $rgbBottom); 

     // If these arrays are not close, then let's call this 4:3 aspect 
     if(!$this->areArraysClose($colorsTop, $colorsBottom, 20)) { 
      return false; 
     } 
    } 

    // Default to widescreen 
    return true; 
} 

// Determine if the numeric values in the RGBA array are within some delta from each other 
function areArraysClose(&$a, &$b, $delta = 10) { 
    foreach($a as $key => $val) { 
     if(abs($val - $b[$key]) > $delta) { 
      return false; 
     } 
    } 
    return true; 
} 

Bu yeterli bir şekilde çalışıyor gibi görünüyor. Açık bir gelişme, piksellerin siyaha yakın olup olmadığını kontrol etmek veya siyah çubukları otomatik olarak kaldırmak için bazı görüntü işlemlerini uygulamak ve ardından kalan görüntünün boyutlarını kontrol etmektir. Bununla birlikte, umudum, bir alan bilgili SO üyesi, bu tavşan deliğinin derinliklerine inmeden önce daha iyi bir çözüme sahip olacaktı ve someone came through.