【问题标题】:It is possible to display a video thumbnail from a URL on Android 4 and above?是否可以在 Android 4 及更高版本上显示来自 URL 的视频缩略图?
【发布时间】:2012-11-24 11:00:45
【问题描述】:

以下两项在模拟器 (2.3.3) 上都可以正常工作,但在真实设备上(Nexus S 和 4.1.2)没有显示缩略图的图像。我还将尝试在Android 4 Emulator 上运行它。如果我为ImageView 设置默认android:src,则不再显示。这让我觉得它被替换了,但是ImageView是空的。

public class MainActivity extends Activity {

    ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        img = (ImageView)findViewById(R.id.img_thumbnail);
        new MyAsync().execute("http://commonsware.com/misc/test.mp4");
    }

    //This version is still not working, but it's more readable (edited: Selvin).
    public class MyAsync extends AsyncTask<String, Void, Bitmap>{

        @Override
        protected Bitmap doInBackground(String... objectURL) {
            //return ThumbnailUtils.createVideoThumbnail(objectURL[0], Thumbnails.MINI_KIND);
            return ThumbnailUtils.extractThumbnail(ThumbnailUtils.createVideoThumbnail(objectURL[0], Thumbnails.MINI_KIND), 100, 100);
        }

        @Override
        protected void onPostExecute(Bitmap result){
             img.setImageBitmap(result);
        }
    }
}

我知道之前有人问过类似的问题,Displaying video thumbnails in an Android device from a remote video URL,但我已经尝试过这个并且结果相同。

为什么这在设备上不起作用以及如何使它起作用?

【问题讨论】:

  • define not working ...任何logcat日志?
  • 所以提取后 bmThumbnail 为空?尝试在 AsyncTask 中调用 extract ...
  • @AlexAndro 请检查您的互联网连接。
  • hmmm starnge ...但它不依赖于模拟器/设备,而是依赖于android版本......它适用于2.3.3但不适用于4.1.2......我虽然它是因为NetworkOnMainTE但是即使使用 AsyncTask 它也不起作用......也许 createVideoThumbnail 不应该与 http 模式 filePath 一起使用......
  • @Selvin 是的,您对 SO 版本的看法是对的,我已经在 Android4 上使用 AsyncTask 进行了尝试,但它不起作用。我看到互联网上的示例使用 sdcard 而不是 URL。

标签: android url bitmap video-thumbnails


【解决方案1】:

使用 FFmpegMediaMetadataRetriever 在所需位置提取缩略图:FFmpegMediaMetadataRetriever

【讨论】:

  • 我已经尝试过你的库并且它工作正常。使用描述中的示例代码,Bitmap b = mmr.getFrameAtTime(2000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST); 工作! byte [] artwork = mmr.getEmbeddedPicture(); 无论如何都会返回 null
  • 太迟钝了我仍在寻找一种可行的方法来获取本地文件的缩略图文件路径或uri
  • 这个库的大小几乎是 25MB!
  • @AmirHosseinGhasemi,是的。这是因为 AAR 必须包含每个 ABI 的单独二进制文件,因为它使用 NDK。解决方法是使用提供的 Gradle 风格或预构建的 AAR,并为每个架构构建单独的 APK。
【解决方案2】:

这在 Android 和 Java 上是不可能的,而且据我所知,如果不下载整个视频(如果我错了,请纠正我)。 YouTube 和任何其他大型视频服务提供一个简单的 API 来获取视频拇指是有充分理由的。因此,如果视频所在的服务器不支持这种 API,那你就倒霉了。

【讨论】:

  • 实际上我的视频位于亚马逊上。他们提供了这样一种 API。使用上面描述的方法,我使用递归线程在大约 2 小时内成功地在 Android 2.3 模拟器上生成了 500 多个缩略图。那些视频占用超过 32 GB 所以......我不知道模拟器在幕后是如何工作的,但我想如果它会下载它,我会观察到这样的内存占用空间。也许这是暂时的,我不知道该说什么,但它确实适用于 2.3,但不适用于 Android 4+。
  • 这是我使用 Amazon API 访问视频的一小部分:stackoverflow.com/questions/13287233/…
  • @AlexAndro 好吧,我在文档中唯一能找到的用于从视频生成缩略图的是 MediaStore.Video.Thumbnails,它仅适用于内部和外部存储。如果您之前的解决方案满足您的需求,我会说随意使用它:一次下载视频 1 并生成拇指,然后再次删除视频:S
  • @AlexAndro 我只能说之前的解决方案可能是由于一个错误,它至少不遵循文档。
  • 感谢您的回复,但在我看来,我不认为这是一个错误,因为存在 ThumbnailUtils.createVideoThumbnail 类,文档清楚地表明它是 Create a video thumbnail for a video。当然,没有说存储,是的,通常当您看到Path 时,您会想到本地存储。而是可能是 4.0+ 版本的错误,因为没有任何反应。(没有警告,没有错误,没有异常等......)
【解决方案3】:

尝试从缓存文件夹中的文件制作缩略图时,在 2.3 上遇到了同样的问题。设置权限标志解决了这个问题:

videoFile.setReadable(true, false);

【讨论】:

  • 在 2.3 作品上,问题出在 4+ 用于在线视频。
猜你喜欢
  • 2014-06-24
  • 2010-11-23
  • 2013-10-03
  • 2014-01-22
  • 2011-06-27
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多