我想從視頻文件中獲取所有圖像幀,以便使用MediaMetaDataReteriver獲取該圖像並將其存儲在帶有幫助ArrayList位圖的SDCard中,但我對使用FFMPEG不感興趣。如何獲取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(f);
fo.write(bytes.toByteArray());
fo.flush();
fo.close();
i++;
}
}
另一種方法:http://bigflake.com/mediacodec/#ExtractMpegFramesTest – fadden
我已經嘗試過了,但你仍然可以幫助我。 – user3627866
先生可以請你幫我通過你的完整示例代碼爲這個過程 – user3627866