实际上,我需要从视频中获取所有帧,但在使用 Mediametadataretriever、缩略图、时间戳获取帧时,我经常重复获取第一帧,然后获取特定时间帧。
我通过更改所有 GetFrameAtTime(options) 尝试了很多修复,但仍然保持不变。
我的视频持续时间是 127040(2:07 秒),这里我分割为 32 帧并将帧保存在 SDCard 中,可以查看所有 32 个帧,但所有 32 帧重复相同的帧。
我应该在没有 FFMPEG 和 xuggler 帮助的情况下得到这些。
是否有任何替代方法或任何其他库文件可以在 Android 中使用,如果有请帮助我朋友们。
这是我的完整代码
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
File videoFile=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Movies/MEMO.mp4";
Uri videoFileUri=Uri.parse(videoFile.toString());
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(videoFile.getAbsolutePath());
ArrayList<Bitmap> rev=new ArrayList<Bitmap>();
//Create a new Media Player
MediaPlayer mp = MediaPlayer.create(getBaseContext(), videoFileUri);
int millis = mp.getDuration();
for(int i=0;i<millis;i+=100){
Bitmap bitmap=retriever.getFrameAtTime(i,MediaMetadataRetriever.OPTION_CLOSEST);
rev.add(bitmap);
try {
saveFrames(rev);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void saveFrames(ArrayList<Bitmap> saveBitmapList) throws IOException{
String folder = Environment.getExternalStorageDirectory().toString();
File saveFolder = new File(folder + "/Movies/new /";
if(!saveFolder.exists()){
saveFolder.mkdirs();
}
int i=1;
for (Bitmap b : saveBitmapList){
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
File f = new File(saveFolder,("frame"+i+".jpg");
f.createNewFile();
FileOutputStream fo = new FileOutputStream;
fo.write(bytes.toByteArray());
fo.flush();
fo.close();
i++;
}
}
FFmpeg媒体元数据检索器 https://github.com/wseemann/FFmpegMediaMetadataRetriever应该可以解决你的问题。可以找到用于测试的示例 APKhere https://github.com/wseemann/FFmpegMediaMetadataRetriever/blob/master/fmmr-demo/FMMRDemo.apk?raw=true。只需单击 SD 卡上的文件,系统就会提示您使用演示应用程序打开它。
要使用该库,只需解压以下内容即可this https://github.com/wseemann/FFmpegMediaMetadataRetriever/blob/master/fmmr-library/prebuilt-libs.tar.gz将文件放入项目的“libs”文件夹中。并将现有的导入语句更改为:
import android.media.MetadataRetriever;
to:
import wseemann.media.FFmpegMediaMetadataRetriever;
并改变:
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
to:
FFmpegMediaMetadataRetriever retriever = new FFmpegMediaMetadataRetriever();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)