{"id":27402316,"url":"https://github.com/hi-dhl/screenvideo","last_synced_at":"2026-03-07T08:03:39.741Z","repository":{"id":107967501,"uuid":"55385212","full_name":"hi-dhl/screenVideo","owner":"hi-dhl","description":"screenVideo是一个通用的视频截图工具，目前已经适配大部分机型，对于个别机型不能使用的欢迎issuses","archived":false,"fork":false,"pushed_at":"2019-08-23T15:36:18.000Z","size":70667,"stargazers_count":13,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-14T04:30:36.957Z","etag":null,"topics":["canva","java","mediametadataretriever","mediaplayer"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hi-dhl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-04-04T04:34:28.000Z","updated_at":"2024-10-11T18:51:15.000Z","dependencies_parsed_at":"2023-03-13T14:29:36.964Z","dependency_job_id":null,"html_url":"https://github.com/hi-dhl/screenVideo","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hi-dhl/screenVideo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hi-dhl%2FscreenVideo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hi-dhl%2FscreenVideo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hi-dhl%2FscreenVideo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hi-dhl%2FscreenVideo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hi-dhl","download_url":"https://codeload.github.com/hi-dhl/screenVideo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hi-dhl%2FscreenVideo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30209797,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T05:23:27.321Z","status":"ssl_error","status_checked_at":"2026-03-07T05:00:17.256Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["canva","java","mediametadataretriever","mediaplayer"],"created_at":"2025-04-14T04:25:07.566Z","updated_at":"2026-03-07T08:03:39.726Z","avatar_url":"https://github.com/hi-dhl.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 获取视频截图\n\n\u003e最近在搞一个视频截图的功能，自己在探索过程中，看到很多各种各样的解法，走了很多弯路，为了避免做相同功能的朋友们走很多弯路，我把自己解决方案，及探索过程遇到的Bug记录下来\n\u003e\n\u003escreenVideo是一个通用的视频截图工具，目前已经适配大部分机型，对于个别机型不能使用的欢迎issuses，Demo中的视频的url不可用，视频的url可以从任意视频网站找一个可以播放的视频地址，用火狐获取一下播放的URL,替换demo中的url即可 [Github下载](https://github.com/hi-dhl/screenVideo)\n\n\n\n\n最开始想的是直接用View截图的方式截取当前的视频，结果截取的来的图片是黑屏，附上View截图代码\n\n```\npublic  Bitmap convertViewToBitmap(View view){\n    view.destroyDrawingCache();//销毁旧的cache销毁，获取cache通常会占用一定的内存，所以通常不需要的时候有必要对其进行清理\n    view.setDrawingCacheEnabled(true);//cache开启\n    view.buildDrawingCache();//创建新的缓存,获取cache通常会占用一定的内存，所以通常不需要的时候有必要对其进行清理,在每次获取新的,先销毁旧的缓存\n    view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));//测量view\n    Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());//将缓存的view转换为图片\n    return bitmap;\n}\n```\n\n上面的方式只能对静态的View进行截图，但是动态的比如说视频，那么截出来的图片就是黑屏。\n用SurfaceView显示在线视频，然后通过上面截图方式，得到图片是黑屏，（关于黑屏的原因大家可以去网上搜索，可以得到你想要的答案，这里就不在说了）于是我就去谷歌，各大博客上寻求解决方案，发现Android提供了MediaMetadataRetriever这个类来获取缩放图，于是按照这个思路去搜索，发现可以通过获取能够获取当前播放的帧数，来进行截图，以下是我的最终解决方案\n\n```\n/**\n * 视频截图代码\n * @param url   播放的url\n * @param width 生成图片的宽度\n * @param height    生成图片的高度\n * @param currentVideoTime  当前播放的播放的秒数\n * @return\n */\n@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)\nprivate Bitmap createVideoThumbnail(String url, int width, int height,String currentVideoTime) {\n    Bitmap bitmap = null;\n    MediaMetadataRetriever retriever = new MediaMetadataRetriever();\n    int kind = MediaStore.Video.Thumbnails.MINI_KIND;\n    try {\n        if (Build.VERSION.SDK_INT \u003e= 14) {//Android4.0以上的设备,必须使用这种方式来设置源播放视频的路径\n            retriever.setDataSource(url, new HashMap\u003cString, String\u003e());\n        } else {\n            retriever.setDataSource(url);\n        }\n        int millis = mMdeiaPlayer.getDuration();\n        Log.e(TAG, \"-----millis----\" + millis);\n        int pro = mMdeiaPlayer.getCurrentPosition();\n        Log.e(TAG,\"-----pro----\"+pro);\n        String timeString = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);\n        long time = Long.parseLong(timeString) * 1000; //获取总长度,这一句也是必须的\n        long d = time*pro/millis;//计算当前播放的帧数,来截取当前的视频\n        Log.e(TAG,\"---------\"+d);\n        bitmap = retriever.getFrameAtTime(d, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);\n        if (kind == MediaStore.Images.Thumbnails.MICRO_KIND \u0026\u0026 bitmap != null) {\n            bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,\n                    ThumbnailUtils.OPTIONS_RECYCLE_INPUT);\n        }\n    } catch (IllegalArgumentException ex) {\n        // Assume this is a corrupt video file\n    } catch (RuntimeException ex) {\n        // Assume this is a corrupt video file.\n    } finally {\n        try {\n            retriever.release();\n            mMdeiaPlayer.start();\n        } catch (RuntimeException ex) {\n            // Ignore failures while cleaning up.\n        }\n    }\n\n    return bitmap;\n}\n```\n\n[Github下载地址 : https://github.com/hi-dhl/screenVideo](https://github.com/hi-dhl/screenVideo)\n\n## bug及解决方案\n\n#### start called in state 4\n\n```\n04-05 10:58:14.169 2237-2237/demo.dhl.con.onlinevideo E/MediaPlayer: start called in state 4\n04-05 10:58:14.169 2237-2237/demo.dhl.con.onlinevideo E/MediaPlayer: error (-38, 0)\n04-05 10:58:14.169 2237-2237/demo.dhl.con.onlinevideo E/MediaPlayer: Error (-38,0)\n04-05 10:58:14.176 2237-2250/demo.dhl.con.onlinevideo E/MediaPlayer: error (261, -1003)\n04-05 10:58:14.176 2237-2237/demo.dhl.con.onlinevideo E/MediaPlayer: Error (261,-1003)\n```\n\n可能由于的播放的文件错误，或者给的url地址不能播放，可以在浏览器中试一下。\n\n#### start called in state 1\n\n```\n04-05 11:50:27.346 2038-2038/demo.dhl.con.onlinevideo E/MediaPlayer: start called in state 1\n04-05 11:50:27.347 2038-2038/demo.dhl.con.onlinevideo E/MediaPlayer: error (-38, 0)\n04-05 11:50:27.367 2038-2050/demo.dhl.con.onlinevideo E/MediaPlayer: error (261, -1003)\n04-05 11:50:27.367 2038-2038/demo.dhl.con.onlinevideo E/MediaPlayer: Error (261,-1003)\n```\n\n原因：\n\n```\nStreaming is Not supported before Android 3.0\nPlease test in device having above 3.0 version\n```\n\n解决方案：\n\n```\n![](http://upload-images.jianshu.io/upload_images/1479838-d821c0b136e94734.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n这是Android官网关于，Android所支持的网络协议网络协议\n\u003e音频和视频播放支持以下网络协议：\n\u003eRTSP协议（RTP，SDP的）\n\u003eHTTP / HTTPS的进步流\n\u003eHTTP / HTTPS的现场直播议定书草案：\n\u003eMPEG-2 TS流媒体文件只\n\u003e协议版本3（的Andr​​oid 4.0及以上）\n\u003e议定书“第2版（Android的3.x版）\n\u003e不支持之前的Andr​​oid 3.0\n\u003e注： HTTPS不支持之前的Android 3.1。\n更换一台Android3.0以上的设备就好了\n```\n\n#### status=0x80000000\n\n```\njava.io.IOException: setDataSource failed.: status=0x80000000\n```\n\n* 第一种解决方法\n\n```\nInputStream in = getResources().getAssets().open(\"GPSResp.dat\");\n```\n\n* 第二种解决方案\n\n将播放的视频或者音乐因为转换成Android所支持的格式\n下面是Android所支持的格式\n\n```\nstatic const char* kNoCompressExt[] = {\n    \".jpg\", \".jpeg\", \".png\", \".gif\",\n    \".wav\", \".mp2\", \".mp3\", \".ogg\", \".aac\",\n    \".mpg\", \".mpeg\", \".mid\", \".midi\", \".smf\", \".jet\",\n    \".rtttl\", \".imy\", \".xmf\", \".mp4\", \".m4a\",\n    \".m4v\", \".3gp\", \".3gpp\", \".3g2\", \".3gpp2\",\n    \".amr\", \".awb\", \".wma\", \".wmv\"\n};\n```\n#### java.io.IOException: Prepare failed.: status=0x1\n\nMediaPlay播放视频的时候报下面的错\n\n```\n    java.io.IOException: Prepare failed.: status=0x1\n```\n\n解决方案：把mediaPlayer.prepare;改成 mediaPlayer.prepareAsync();\n\n#### getFrameAtTime: videoFrame is a NULL pointer\n\n播放视频的时候包下面的错误\n\n```\n    getFrameAtTime: videoFrame is a NULL pointer\n```\n\n解决方案：视频地址错误，或者 视频损坏不能播放，检查视频是否正常\n\n#### 怎么样对播放的视频进行截图\n\n当我们使用SurfaceView的来显示播放的视频的时候，需要截取视频的时候，直接使用普通View获取截图的方式，会是黑屏，网上很多博客提到了解决方案mHolder.lockCanvas() 获取Canva来获取画布，实现截取视频，其实是错误的，我照着网上的贴子做了，报了下面的错，不知道是不是我的使用方法有错，请网友指正\n\n```\n    12:58:24.690: E/BaseSurfaceHolder(719): Exception locking surface\n    12:58:24.690: E/BaseSurfaceHolder(719): java.lang.IllegalArgumentException\n    12:58:24.690: E/BaseSurfaceHolder(719):   at android.view.Surface.nativeLockCanvas(Native Method)\n    12:58:24.690: E/BaseSurfaceHolder(719):   at android.view.Surface.lockCanvas(Surface.java:447)\n    12:58:24.690: E/BaseSurfaceHolder(719):   at com.android.internal.view.BaseSurfaceHolder.internalLockCanvas(BaseSurfaceHolder.java:184)\n```\n\n原因：\nSurfaceView 主要用来两种用法：\n\n1. 和MediaPlay配合使用播放视频，\n2. 或者和Canvas配合使用实现一些动画\n\n但是不能这两种方法一起使用或者就会报上面的错。\n\n解决方案：如果想要做视频截取的话，可以使用MediaMetadataRetriever这个类截取当前播放的帧画面，来是现实视频截图功能，项目贴上，代码中有注释\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhi-dhl%2Fscreenvideo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhi-dhl%2Fscreenvideo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhi-dhl%2Fscreenvideo/lists"}