【问题标题】:How to display thumbnail of YouTube Videos in Android如何在 Android 中显示 YouTube 视频的缩略图
【发布时间】:2011-11-11 14:11:19
【问题描述】:

我正在编写一个应用程序,我想在其中显示 YouTube 视频列表。但我希望列表显示包含其他信息的视频标题,但也显示视频的缩略图,就像我们去 www.youtube.com

时一样

有人可以帮我解决如何显示视频网址的缩略图吗?

【问题讨论】:

    标签: android youtube


    【解决方案1】:

    试试这个:

    1. 从 URL 解析视频 ID:这是 URL 中的“v”参数。 IE。 http://www.youtube.com/watch?v=xAiiwSXVRiw中的“xAiiwSXVRiw”@

    2. 通过 Youtube Gdata URL 获取视频元数据:http://gdata.youtube.com/feeds/api/videos/xAiiwSXVRiw

    3. 解析返回的 XML 并查找 <media:thumbnail url='..'>。 'url' 属性包含缩略图 url。

    【讨论】:

    • 这个答案已经过时了
    • 过时的答案。 URL 响应 - “不再可用”
    【解决方案2】:

    结合两个已接受的答案

    How to make YouTube video thumbnails in android?

    和

    How to get video thumbnail of youtube video in android list in android?

    最后你只需要使用YOUTUBE URL的ID。

    我找到了一个PHP Answer for same question,他们这样描述:

    每个 YouTube 视频都有 4 张生成的图片。可以预见,它们的格式如下:

    http://img.youtube.com/vi/<insert-youtube-video-id-here>/0.jpg
    http://img.youtube.com/vi/<insert-youtube-video-id-here>/1.jpg
    http://img.youtube.com/vi/<insert-youtube-video-id-here>/2.jpg
    http://img.youtube.com/vi/<insert-youtube-video-id-here>/3.jpg
    

    列表中的第一个是全尺寸图像,其他是缩略图。默认缩略图(即1.jpg、2.jpg、3.jpg 之一)是:

    http://img.youtube.com/vi/<insert-youtube-video-id-here>/default.jpg
    

    对于缩略图的高质量版本,请使用类似于此的 url:

    http://img.youtube.com/vi/<insert-youtube-video-id-here>/hqdefault.jpg
    

    还有一个中等质量版本的缩略图,使用类似于总部的网址:

    http://img.youtube.com/vi/<insert-youtube-video-id-here>/mqdefault.jpg
    

    对于标准定义版本的缩略图,使用类似这样的 url:

    http://img.youtube.com/vi/<insert-youtube-video-id-here>/sddefault.jpg
    

    对于缩略图的最大分辨率版本,请使用类似于此的 url:

    http://img.youtube.com/vi/<insert-youtube-video-id-here>/maxresdefault.jpg
    

    以上所有网址也可通过 https 获得。只需将上述任一网址中的http 更改为https。

    此外,略短的主机名 i3.ytimg.com 可以代替上述示例网址中的 img.youtube.com。

    示例:

    我有一个网址https://www.youtube.com/watch?v=-OKrloDzGpU

    现在我将从 URL 中获取 ID,即:-OKrloDzGpU

    中图:http://img.youtube.com/vi/-OKrloDzGpU/mqdefault.jpg

    高清图片:http://img.youtube.com/vi/-OKrloDzGpU/hqdefault.jpg

    使用 Glide 或 Picasso 在 Android 中加载图像:

    // Picasso        
    Picasso.with(context)
           .load("http://img.youtube.com/vi/-OKrloDzGpU/mqdefault.jpg")
           .into(imageView);
    
    // Glide
    Glide.with(this)
         .load("http://img.youtube.com/vi/-OKrloDzGpU/mqdefault.jpg")
         .into(imageView);
    

    谢谢。希望对大家有所帮助。

    【讨论】:

    • 您知道需要在 youtube 缩略图上显示哪些附加信息吗?诸如 youtube tm、youtube“播放”图标等。
    • 响应延迟没有问题吗?
    • 效果很好!非常感谢! ??
    【解决方案3】:

    Glide jar 文件下载链接 http://grepcode.com/snapshot/repo1.maven.org/maven2/com.github.bumptech.glide/glide/3.6.0

    String url = "https://img.youtube.com/vi/"+videoURL.split("\\=")[1]+"/0.jpg";
    Glide.with(this).load(url).into(imageView);
    

    【讨论】:

      【解决方案4】:

      如果您有 Youtube 视频的 URL。使用下面的代码获得中/高 优质缩略图网址

              String url = "https://www.youtube.com/watch?v=tResEeK6P5I"
              String videoId = url.split("v=")[1]; //you will get this video id "tResEeK6P5I"
      
              String thumbnailMq = "http://img.youtube.com/vi/"+videoId+/mqdefault.jpg //medium quality thumbnail
      
              String thumbnailHq = "http://img.youtube.com/vi/"+videoId+/hqdefault.jpg //high quality thumbnail
      
              //your final urls will be like 
              http://img.youtube.com/vi/tResEeK6P5I/mqdefault.jpg
              http://img.youtube.com/vi/tResEeK6P5I/hqdefault.jpg
      

      【讨论】:

      • 非常感谢,使用图片而不是缓慢加载 youtube API thumbnail 真的很有帮助
      【解决方案5】:

      这个问题已经很老了,但它仍然出现在 Google 的热门搜索答案中,所以这就是我如何使用 Android YouTube API 解决的问题。

      YouTubeThumbnailView thumbnail = findViewById(R.id.thumbnail);
      thumbnail.initialize(YOUTUBE_API_KEY, new YouTubeThumbnailView.OnInitializedListener() {
      
          @Override
          public void onInitializationSuccess(YouTubeThumbnailView youTubeThumbnailView, 
                                              YouTubeThumbnailLoader youTubeThumbnailLoader) {
              youTubeThumbnailLoader.setVideo(youtubeID);
              youTubeThumbnailLoader.setOnThumbnailLoadedListener(new YouTubeThumbnailLoader.OnThumbnailLoadedListener() {
      
                  @Override
                  public void onThumbnailLoaded(YouTubeThumbnailView youTubeThumbnailView, String s) {
                      //need to release the loader!!!
                      youTubeThumbnailLoader.release();
                  }
      
                  @Override
                  public void onThumbnailError(YouTubeThumbnailView youTubeThumbnailView, 
                                               YouTubeThumbnailLoader.ErrorReason errorReason) {
                      //need to release the loader!!!
                      youTubeThumbnailLoader.release();
                  }
              });
           }
      
           @Override
           public void onInitializationFailure(YouTubeThumbnailView youTubeThumbnailView, 
                                          YouTubeInitializationResult youTubeInitializationResult) {
           //handle error here
           }
      });
      

      YOUTUBE_API_KEY 在here 中获取您的 api 密钥

      youtubeID你需要使用视频的ID而不是完整的URL。

      文档here。

      【讨论】:

        【解决方案6】:

        以上所有答案都在进行不需要的字符串操作。你可以很容易地使用Uri得到if id

        科特林

        val videoId = Uri.parse("https://www.youtube.com/watch?v=dQw4w9WgXcQ").getQueryParameter("v")
        val thumbnailUri = Uri.parse("https://img.youtube.com/vi/${videoId}/0.jpg")
        Glide.with(this).load(thumbnailUri).into(imageView)
        

        Java

        String videoId = Uri.parse("https://www.youtube.com/watch?v=dQw4w9WgXcQ").getQueryParameter("v");
        Uri thumbnailUri = Uri.parse("https://img.youtube.com/vi/${videoId}/0.jpg");
        Glide.with(this).load(thumbnailUri).into(imageView);
        

        【讨论】:

          【解决方案7】:

          如果您想要高质量的缩略图,但不适用于所有视频

          Width | Height | URL
          ------|--------|----
          640   | 480    | https://i.ytimg.com/vi/<VIDEO ID>/sd1.jpg
          640   | 480    | https://i.ytimg.com/vi/<VIDEO ID>/sd2.jpg
          640   | 480    | https://i.ytimg.com/vi/<VIDEO ID>/sd3.jpg
          640   | 480    | https://i.ytimg.com/vi/<VIDEO ID>/sddefault.jpg
          1280  | 720    | https://i.ytimg.com/vi/<VIDEO ID>/hq720.jpg
          1920  | 1080   | https://i.ytimg.com/vi/<VIDEO ID>/maxresdefault.jpg
          

          如果您希望缩略图可用于所有视频(质量相对较低)

          Width | Height | URL
          ------|--------|----
          120   | 90     | https://i.ytimg.com/vi/<VIDEO ID>/1.jpg
          120   | 90     | https://i.ytimg.com/vi/<VIDEO ID>/2.jpg
          120   | 90     | https://i.ytimg.com/vi/<VIDEO ID>/3.jpg
          120   | 90     | https://i.ytimg.com/vi/<VIDEO ID>/default.jpg
          320   | 180    | https://i.ytimg.com/vi/<VIDEO ID>/mq1.jpg
          320   | 180    | https://i.ytimg.com/vi/<VIDEO ID>/mq2.jpg
          320   | 180    | https://i.ytimg.com/vi/<VIDEO ID>/mq3.jpg
          320   | 180    | https://i.ytimg.com/vi/<VIDEO ID>/mqdefault.jpg
          480   | 360    | https://i.ytimg.com/vi/<VIDEO ID>/0.jpg
          480   | 360    | https://i.ytimg.com/vi/<VIDEO ID>/hq1.jpg
          480   | 360    | https://i.ytimg.com/vi/<VIDEO ID>/hq2.jpg
          480   | 360    | https://i.ytimg.com/vi/<VIDEO ID>/hq3.jpg
          480   | 360    | https://i.ytimg.com/vi/<VIDEO ID>/hqdefault.jpg
          

          因此,适用于所有视频的最高质量缩略图是 480x360。

          您可以使用链接:https://i.ytimg.com/vi/&lt;VIDEO ID&gt;/0.jpg

          String videoId = IfXNjuoqt0Q;
          String thumnailLink = "https://i.ytimg.com/vi/"+videoId+"/0.jpg";
          

          https://i.ytimg.com/vi/IfXNjuoqt0Q/0.jpg

          在 Android 中加载图片

          // Picasso        
          Picasso.with(context)
                 .load("https://i.ytimg.com/vi/IfXNjuoqt0Q/0.jpg")
                 .into(imageView);
          
          // Glide
          Glide.with(this)
               .load("https://i.ytimg.com/vi/IfXNjuoqt0Q/0.jpg")
               .into(imageView);
          

          --------直到上面已经回答了-----

          如果您想从 480x360 的缩略图中删除黑条(youtube 中所有视频都可以使用的最高质量图像),但问题是它带有黑条

          
          import android.app.Activity;
          import android.graphics.Bitmap;
          import android.graphics.BitmapFactory;
          import android.util.Log;
          import android.widget.ImageView;
          
          import java.io.InputStream;
          import java.net.HttpURLConnection;
          import java.net.URL;
          
          public class ThumbnailHandler {
          
              public static Bitmap RemoveBlackBar(Bitmap bitmap){
          
                  if (bitmap.getWidth() == 480 && bitmap.getHeight() == 360 ){
          
                      int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
                      int[] pixels_out = new int[bitmap.getWidth() * bitmap.getHeight()];
          
                      // get pixel array from source
                      bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
          
                      for (int y=0; y<270; y++){
          
                          for (int x=0; x < bitmap.getWidth() ; x++){
                              pixels_out [y * bitmap.getWidth() + x] = pixels [(y+45) * bitmap.getWidth() + x];
                          }
                      }
          
                      Bitmap bmOut = Bitmap.createBitmap(bitmap.getWidth(), 270, bitmap.getConfig());
                      bmOut.setPixels(pixels_out, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), 270);
          
          
                      return bmOut;
                  }else {
                      return bitmap;
                  }
              }
          
              public static Bitmap getBitmapFromURL(String src) {
                  try {
                      URL url = new URL(src);
                      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                      connection.setDoInput(true);
                      connection.connect();
                      InputStream input = connection.getInputStream();
                      Bitmap myBitmap = BitmapFactory.decodeStream(input);
                      return myBitmap;
                  } catch (Exception e) {
                      Log.e("shabir", "err: "+e );
                      e.printStackTrace();
                      return null;
                  }
              }
          
              public static void getYtThumbnail_480_270(String url,YtThumbnailDownloadListener listener){
                  new Thread(new Runnable() {
                      @Override
                      public void run() {
                          Bitmap bitmap = getBitmapFromURL(url);
                          bitmap = RemoveBlackBar(bitmap);
                          listener.onThumbnailDownloaded(bitmap);
                      }
                  }).start();
              }
          
              public static void getYtThumbnail_480_270(String url, ImageView target, Activity activity){
                  new Thread(new Runnable() {
                      @Override
                      public void run() {
                          Bitmap bitmap = getBitmapFromURL(url);
                          Bitmap finalBitmap = RemoveBlackBar(bitmap);
                          activity.runOnUiThread(() -> {
          
                              target.setImageBitmap(finalBitmap);
          
                          });
                      }
                  }).start();
              }
          
              public interface YtThumbnailDownloadListener{
                  void onThumbnailDownloaded(Bitmap bitmap);
              }
          }
          

          将上面的类复制到您的项目中

          以上类将 480x360 缩略图转换为 480x270 以去除黑条,

          在 Android 中加载图片

          
          // url
          url = "https://i.ytimg.com/vi/IfXNjuoqt0Q/0.jpg";
          
          
          // call to load thumbnail in Image view        
          ThumbnailHandler.getYtThumbnail_480_270(url,
                                                  imageView,
                                                  MainActivity.this);
          
          // call to download thumbnail in bitmap format
          ThumbnailHandler.getYtThumbnail_480_270(url, new ThumbnailHandler.YtThumbnailDownloadListener() {
                              @Override
                              public void onThumbnailDownloaded(Bitmap bitmap) {
                                  // Use thumbnail bitmap
                              }
                          });
          

          最高质量的缩略图 (480x270),适用于所有视频,没有黑条

          【讨论】:

            猜你喜欢
            • 2011-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-04
            • 1970-01-01
            • 2020-12-09
            相关资源
            最近更新 更多