Tôi đang cố trích xuất tất cả các khung hình từ video.
Bằng mã sau tôi muốn tìm nạp 30 khung hình đầu tiên của video, nhưng tôi chỉ nhận được khung hình đầu tiên 30 lần.Trích xuất bitmap từ video trong android
private ArrayList<Bitmap> getFrames(String path) {
try {
ArrayList<Bitmap> bArray = new ArrayList<Bitmap>();
bArray.clear();
MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
mRetriever.setDataSource("/sdcard/myvideo.mp4");
for (int i = 0; i < 30; i++) {
bArray.add(mRetriever.getFrameAtTime(1000*i,
MediaMetadataRetriever.OPTION_CLOSEST_SYNC));
}
return bArray;
} catch (Exception e) { return null; }
}
Bây giờ, làm cách nào để có được tất cả các khung hình từ video?
Thời gian cho 'getFrameAtTime' là một phần triệu giây, do đó, đối với video 30 fps, sẽ có khoảng 33333 micro giây giữa mỗi khung. Khung cuối cùng mà mã của bạn cố gắng đọc là 30000 micro giây - tức là bạn thậm chí sẽ không chuyển sang khung thứ hai (tùy thuộc vào tốc độ khung hình của bạn). Một điều nữa là 'OPTION_CLOSEST_SYNC' truy xuất _keyframe_ gần nhất với thời gian bạn chỉ định. Thường có ít khung hình chính hơn tổng số khung hình trong video nén. – Michael
Xin chào @Michael, Video của tôi với 30 khung hình/giây. Và bây giờ tôi đang sử dụng sau mã cho bitmap trích .... for (int i = 0; i <10; i ++) { \t \t \t \t bArray.add (mRetriever.getFrameAtTime (33333 * i, \t \t \t \t \t \t MediaMetadataRetriever.OPTION_CLOSEST_SYNC)); \t \t \t} nhưng không có gì thay đổi .. ở đây tôi chỉ có khung đầu tiên trong bitmap .. –
Như tôi đã viết trong bình luận đầu tiên, bạn sẽ lấy keyframe gần nhất với thời gian đã cho khi bạn sử dụng 'OPTION_CLOSEST_SYNC'. Không chắc video có chứa 10 khung hình trở lên cho mỗi khung hình chính. Sử dụng 'OPTION_CLOSEST' nếu bạn muốn nhận bất kỳ loại khung hình nào thay vì chỉ các khung hình chính. – Michael