gpt4 book ai didi

java - 如何使用 ExtractMpegFrames.java 正确地将 mp4 中的帧保存为 png 文件?

转载 作者:太空宇宙 更新时间:2023-11-04 11:01:07 25 4
gpt4 key购买 nike

我正在尝试使用此处找到的 ExtractMpegFrames.java 类从 mp4 文件获取所有帧 http://bigflake.com/mediacodec/ExtractMpegFramesTest.java.txt

我当前所做的是在存储所有帧的目录中创建一个临时文件(File.createTempFile),创建一个 FileOutputStream 并执行

bm.compress(Bitmap.CompressFormat.PNG, 100, fOut) 

其中 fOut 是文件的输出流。

目前,保存的图像如下所示:/image/Sfy4R.jpg

使用 Camera2 Api,我录制视频并将其保存为 mp4。根据 VLC,视频的色彩空间为 Planar 4:2:0 YUV Full Scale。

环顾四周,似乎每个供应商都使用不同的色彩空间 https://stackoverflow.com/a/21266510/7351748 。我知道 ffmpeg 可以与颜色空间进行转换,但我不能使用它。

我不知道从哪里开始解决奇怪的输出 png 问题。我假设这是一个色彩空间问题,但我在这里可能完全错误。

最佳答案

您可以使用 ffmpeg 库获取所有视频帧,这里是工作代码。

添加依赖

compile 'com.writingminds:FFmpegAndroid:0.3.2'

到你的gradle

      private void loadFFMpegBinary() {
try {
if (ffmpeg == null) {
ffmpeg = FFmpeg.getInstance(this);
}
ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
// @Override
// public void onFailure() {
// showUnsupportedExceptionDialog();
// }

@Override
public void onSuccess() {
Log.d(TAG, "ffmpeg : correct Loaded");
}
});
} catch (FFmpegNotSupportedException e) {

} catch (Exception e) {
Log.d(TAG, "EXception : " + e);
}
}

这是图像提取方法

 public void extractImagesVideo() {
File moviesDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES
);

String filePrefix = "extract_picture";
String fileExtn = ".jpg";
String yourRealPath = getPath(Pick_Video.this, DataModel.selectedVideoUri);
Log.d("selected url", "" + DataModel.selectedVideoUri);
File src = new File(yourRealPath).getAbsoluteFile();

File appDir=new File(moviesDir,"/"+app_name+"/");
if(!appDir.exists())
appDir.mkdir();
DataModel.appDir=appDir;
File dir = new File(appDir, "testVideo");
int fileNo = 0;
while (dir.exists()) {
fileNo++;
dir = new File(moviesDir+"/"+app_name+"/", "testVideo" + fileNo);

}
dir.mkdir();
DataModel.dir = dir;

resultList = new ArrayList<String>(256);

filePath = dir.getAbsolutePath();
File dest = new File(dir, filePrefix + "%03d" + fileExtn);


Log.d(TAG, "startTrim: src: " + src.toString());
Log.d(TAG, "startTrim: dest: " + dest.getAbsolutePath());


String[] complexCommand = { "-i",""+src.toString(),"-qscale:v", "2","-vf", "fps=fps=20/1",dest.getAbsolutePath()};
//"-qscale:v", "2","-vf", "fps=fps=20/1",//
//works fine with speed and
execFFmpegBinary(complexCommand);



}

在按钮点击事件上调用这两个方法

如果有任何疑问,请评论。

关于java - 如何使用 ExtractMpegFrames.java 正确地将 mp4 中的帧保存为 png 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46882929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com