camera录制视频的缩略图获取原理心得分享_Android

1、在thumbnail.java文件里通过调用bitmap = retriever.getFrameAtTime(-1);
这句代码得到bitmap,

2、那么这句代码在MediaMetadataRetriever.java 中调用
getFrameAtTime(timeUs, OPTION_CLOSEST_SYNC)这句代码:
解释一下timeUs,和OPTION_CLOSEST_SYNC这2个变量的含义
timeUs The time position where the frame will be retrieved.
* When retrieving the frame at the given time position, there is no
* guarentee that the data source has a frame located at the position.
* When this happens, a frame nearby will be returned. If timeUs is
* negative, time position and option will ignored, and any frame
* that the implementation considers as representative may be returned

3.由于timeUs等于-1,那么在stagefrightMetadataRetriver.cpp中通过
extractVideoFrameWithCodecFlags()函数

复制代码 代码如下:

if (frameTimeUs < 0) {
if (!trackMeta->findInt64(kKeyThumbnailTime, &thumbNailTime)
|| thumbNailTime < 0) {
thumbNailTime = 0;
}
options.setSeekTo(thumbNailTime, mode);
}else{
...................
}

取得thumbnailTime,
thumbnailTime是取同步帧中最大一帧数据,即有可能不是视频文件的第一个I帧。

4.extractVideoFrameWithCodecFlags()函数中,接着第3条,然后调用err = decoder->read(&buffer, &options);这句代码,其options->seekMode为SEEK_CLOSEST_SYNC这个值

5.如果video codec是mpeg4,则调用MPEG4Extractor.cpp中的read()的函数,
根据前面thumnailtime,找到此时间点的vidoe frame index,然后通过 video frame index,再找临近的同步帧(即I帧)

6.SampleTable.cpp中findSyncSampleNear()函数中,找临近同步帧,
视频文件中会存有所有的同步帧,这个同步帧也有可能是这个同步帧数组中第一个值,也有可能在第5步中得到的video frame index,也有可能位于2个同步帧之间,那么我们通过计算找到这2个同步帧最靠近video frame index的一个同步帧

7.通过上述步骤,找到同步帧,那么根据这个同步帧生成thumbnail的bitmap。

时间: 2024-07-28 23:59:38

camera录制视频的缩略图获取原理心得分享_Android的相关文章

Android camera录制视频没有preview为什么不能成功?API21

问题描述 Android camera录制视频没有preview为什么不能成功?API21 2C http://developer.android.com/guide/topics/media/camera.html Note: It is possible to use MediaRecorder without creating a camera preview first and skip the first few steps of this process. However since

android获取联系人示例分享_Android

复制代码 代码如下: package com.homer.phone; import java.util.ArrayList;import java.util.HashMap; import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.provider.ContactsContract;import android.provider.ContactsCont

android AudioRecorder简单心得分享_Android

1.如何创建一个有效的AudioRecorder实例 Android各种设备的采样频率不同,输入的声道数也不同,如果采用固定的采样频率和声道数,那么得到的AudioRecorder不一定能够正常初始化.为了正常使用,需要尝试各种不同的参数,得到在此设备上可以用的AudioRecorder实例.代码如下: 复制代码 代码如下: private void createAudioRecord() {              for (int sampleRate : new int[]{44100,

【短视频SDK】如何获取单视频的缩略图?

获取视频缩略图iOS和Android分别提供一个方法得到一个视频的缩略图,如果需要多张需要开发者自己调用多次即可. 1.Android获取视频缩略图,仅演示单视频缩略图获取方法 核心接口:AliyunIThumbnailFetcher //1.创建一个AliyunIThumbnailFetcher的实例 AliyunIThumbnailFetcher mThumbnailFetcher = AliyunThumbnailFetcherFactory.createThumbnailFetcher(

ios-如何获取网络视频的缩略图

问题描述 如何获取网络视频的缩略图 用MPMoviePlayerController获取的时候,会有一小段视频声音,如何设置它为静音. 或者还有别的获取缩略图的方法吗? 解决方案 网络视频的缩略图由服务器提供 解决方案二: 用ffmpeg直接获取 解决方案三: 需要使用视频解码库等

我的Android进阶之旅------&amp;gt;使用ThumbnailUtils类获取视频的缩略图

今天看了一段代码,是关于获取视频的缩略图的,让我认识了一个ThumbnailUtils类,代码如下. Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path, Thumbnails.MINI_KIND); //用于获取视频的缩略图 BitmapDrawable background=new BitmapDrawable(bitmap); 通过察看android.media.ThumbnailUtils的源码,可以发现该类提供了三种静态方法

ios开发之Swift获取视频截图(本地视频、网络视频的缩略图)

有时我们需要在界面上显示视频的缩略图,这样用户不用点开也能大概了解到视频的内容.下面分别演示如何获取本地视频,以及网络在线视频的视频截图. 样例的效果图如下,将获取到的截图(视频开始部分)显示在 imageView 中. 开发之Swift获取视频截图(本地视频.网络视频的缩略图)-获取本地视频缩略图"> 1,获取本地视频截图 import UIKit import AVFoundation import MobileCoreServices   class ViewController:

Android系统详解之获取图片和视频的缩略图

从Android 2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接调用获取. 1. static Bitmap createVideoThumbnail(String filePath, int kind) //获取视频文件的缩略图,第一个参数为视频文件的位置,比如/sdcard/andro

android 获取视频,图片缩略图的具体实现

1.获取视频缩略图有两个方法(1)通过内容提供器来获取(2)人为创建缩略图 (1)缺点就是必须更新媒体库才能看到最新的视频的缩略图 [java]复制代码 代码如下:/**      * @param context      * @param cr     * @param Videopath     * @return      */     public static Bitmap getVideoThumbnail(Context context, ContentResolver cr,