获取视频第一帧图片,这种需求不多,之前项目中用到了这个功能踩了点坑,很骚。
获取网络视频
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
//后面这个是传请求Headers,如果有需要可以添加
mmr.setDataSource(url, new HashMap());
获取本地视频(setDataSource
中不需要传第二个参数,直接传路径就好)
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
//后面这个是传请求Headers,如果有需要可以添加
mmr.setDataSource(path, new HashMap());
封装的代码如下:
public class MediaUtils
{
public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;
public static File file;
<span class="hljs-comment">/**
* Create a file Uri for saving an image or video
*/</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Uri <span class="hljs-title">getOutputMediaFileUri</span><span class="hljs-params">(Context context, <span class="hljs-keyword">int</span> type)</span>
</span>{
Uri uri = <span class="hljs-keyword">null</span>;
<span class="hljs-comment">//适配Android N</span>
<span class="hljs-keyword">if</span> (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
{
<span class="hljs-keyword">return</span> FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + <span class="hljs-string">".provider"</span>, getOutputMediaFile(type));
} <span class="hljs-keyword">else</span>
{
<span class="hljs-keyword">return</span> Uri.fromFile(getOutputMediaFile(type));
}
}
<span class="hljs-comment">/**
* Create a File for saving an image or video
*/</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> File <span class="hljs-title">getOutputMediaFile</span><span class="hljs-params">(<span class="hljs-keyword">int</span> type)</span>
</span>{
<span class="hljs-comment">// To be safe, you should check that the SDCard is mounted</span>
<span class="hljs-comment">// using Environment.getExternalStorageState() before doing this.</span>
File mediaStorageDir = <span class="hljs-keyword">new</span> File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), <span class="hljs-string">"image"</span>);
<span class="hljs-comment">// This location works best if you want the created images to be shared</span>
<span class="hljs-comment">// between applications and persist after your app has been uninstalled.</span>
<span class="hljs-comment">// Create the storage directory if it does not exist</span>
<span class="hljs-keyword">if</span> (!mediaStorageDir.exists())
{
<span class="hljs-keyword">if</span> (!mediaStorageDir.mkdirs())
{
<span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
}
}
<span class="hljs-comment">// Create a media file name</span>
String timeStamp = <span class="hljs-keyword">new</span> SimpleDateFormat(<span class="hljs-string">"yyyyMMdd_HHmmss"</span>).format(<span class="hljs-keyword">new</span> Date());
File mediaFile;
<span class="hljs-keyword">if</span> (type == MEDIA_TYPE_IMAGE)
{
mediaFile = <span class="hljs-keyword">new</span> File(mediaStorageDir.getPath() + File.separator +
<span class="hljs-string">"IMG_"</span> + timeStamp + <span class="hljs-string">".jpg"</span>);
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (type == MEDIA_TYPE_VIDEO)
{
mediaFile = <span class="hljs-keyword">new</span> File(mediaStorageDir.getPath() + File.separator +
<span class="hljs-string">"VID_"</span> + timeStamp + <span class="hljs-string">".mp4"</span>);
} <span class="hljs-keyword">else</span>
{
<span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
}
file = mediaFile;
<span class="hljs-keyword">return</span> mediaFile;
}
<span class="hljs-comment">/**
* 获取视频的第一帧图片
*/</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">getImageForVideo</span><span class="hljs-params">(String videoPath, OnLoadVideoImageListener listener)</span>
</span>{
LoadVideoImageTask task = <span class="hljs-keyword">new</span> LoadVideoImageTask(listener);
task.execute(videoPath);
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoadVideoImageTask</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AsyncTask</span><<span class="hljs-title">String</span>, <span class="hljs-title">Integer</span>, <span class="hljs-title">File</span>>
</span>{
<span class="hljs-keyword">private</span> OnLoadVideoImageListener listener;
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">LoadVideoImageTask</span><span class="hljs-params">(OnLoadVideoImageListener listener)</span>
</span>{
<span class="hljs-keyword">this</span>.listener = listener;
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">protected</span> File <span class="hljs-title">doInBackground</span><span class="hljs-params">(String... params)</span>
</span>{
MediaMetadataRetriever mmr = <span class="hljs-keyword">new</span> MediaMetadataRetriever();
String path = params[<span class="hljs-number">0</span>];
<span class="hljs-keyword">if</span> (path.startsWith(<span class="hljs-string">"http"</span>))
<span class="hljs-comment">//获取网络视频第一帧图片</span>
mmr.setDataSource(path, <span class="hljs-keyword">new</span> HashMap());
<span class="hljs-keyword">else</span>
<span class="hljs-comment">//本地视频</span>
mmr.setDataSource(path);
Bitmap bitmap = mmr.getFrameAtTime();
<span class="hljs-comment">//保存图片</span>
File f = getOutputMediaFile(MEDIA_TYPE_IMAGE);
<span class="hljs-keyword">if</span> (f.exists())
{
f.delete();
}
<span class="hljs-keyword">try</span>
{
FileOutputStream out = <span class="hljs-keyword">new</span> FileOutputStream(f);
bitmap.compress(Bitmap.CompressFormat.JPEG, <span class="hljs-number">90</span>, out);
out.flush();
out.close();
} <span class="hljs-keyword">catch</span> (FileNotFoundException e)
{
e.printStackTrace();
} <span class="hljs-keyword">catch</span> (IOException e)
{
e.printStackTrace();
}
mmr.release();
<span class="hljs-keyword">return</span> f;
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onPostExecute</span><span class="hljs-params">(File file)</span>
</span>{
<span class="hljs-keyword">super</span>.onPostExecute(file);
<span class="hljs-keyword">if</span> (listener != <span class="hljs-keyword">null</span>)
{
listener.onLoadImage(file);
}
}
}
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">OnLoadVideoImageListener</span>
</span>{
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">onLoadImage</span><span class="hljs-params">(File file)</span></span>;
}
}