获取视频第一帧

获取视频第一帧图片,这种需求不多,之前项目中用到了这个功能踩了点坑,很骚。
.
获取网络视频
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 &gt;= 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>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Integer</span>, <span class="hljs-title">File</span>&gt;
</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>;
}

}

因为考虑到处理视频比较耗时,上面代码使用了AsycTask+Callback的方式来实现,先保存到本地后在加载本地的图片。 原文地址: https://www.jianshu.com/p/bd308c8371dd
.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值