我有30张JPEG图像(.jpg),分辨率为480 x 640。 每张图片大约需要20KB(所有图片大约需要600KB)。
我正在使用 FFmpeg 命令将这些图片编码为 H264 格式的视频。
我需要这么快才能完成 - 大约1秒钟。
使用经典命令:
ffmpeg -y -f image2 -r 1/5 -i image_%d.jpg -c:v libx264 -r 30 video.mp4
需要 90秒。
添加-preset ultrafast
后:
ffmpeg -y -f image2 -r 1/5 -i image_%d.jpg -c:v libx264 -preset ultrafast -r 30 video.mp4
编码需要 15秒,这要好得多,但仍然不够
我也尝试了其他参数,例如:
-profile:v baseline
-qscale:v
-b:v 1000k
-crf 24
但编码时间不会低于10秒。
我不熟悉FFmpeg命令,也不熟悉我需要使用的参数,这就是我在这里发布这个问题的原因。
视频质量必须正常,不需要完美。
注意:我在Android应用程序中运行这些命令,我使用ProcessBuilder获取ffmpeg可执行文件。
回复1(对Robert Rowntree):
ArrayList<String> l2 = new ArrayList<String>();
//l2.add("ffmpeg");
l2.add("/data/data/" + packageName + "/ffmpeg");
l2.add("-y");
l2.add("-loop");
l2.add("1");
l2.add("-i");
l2.add("frame_%d.jpg");
// l2.add("-t");
// l2.add(strngs[3]);
l2.add("-r");
l2.add("1/2");
l2.add("-preset");
l2.add("superfast");
l2.add("-tune");
l2.add("zerolatency");
// l2.add("-pass");
// l2.add(Integer.valueOf(pass).toString());
l2.add("-vcodec");
l2.add("libx264");
l2.add("-b:v");
l2.add("200k");
l2.add("-bt");
l2.add("50k");
l2.add("-threads");
l2.add("0");
l2.add("-b_strategy");
l2.add("1");
// if(pass ==1){
// l2.add("-an");
// } else {
// l2.add("-acodec");
// l2.add("copy");
// }
l2.add("-f");
l2.add("mp4");
l2.add("-strict");
l2.add("-2");
// l2.add("-passlogfile");
// l2.add(strngs[4]);
// if(pass ==1){
// l2.add("/dev/null");
// } else {
// l2.add(strngs[5]);
// }
l2.add("video.mp4");
//return l2;
答案 0 :(得分:0)
如何摆脱-r 1/5?它加快了我的编码速度。
答案 1 :(得分:0)
IMO - android上的ffmpeg仍然是所有软件(没有gpu或硬件加速)。您可以尝试通过libstagefright / ffmpeg合并questions来查找。无论如何,如果你对快速感兴趣,你应该在android上找到硬件加速解决方案。否则,与任何其他平台相比,受约束平台上的ffmpeg(电池寿命,低功耗CPU)将会非常缓慢。
我因为速度不足而放弃了android,并决定将云实例上传到媒体,然后在下载到Android设备之前先将ffmpeg编码。 有兴趣听听你是否在Android上获得快速结果。
BTW,我使用了2通H264表达式,你在放弃android进行编码之前就看到了这一点。private ArrayList<String> mapFfmpegSwitches(String... strngs){
ArrayList<String> l2 = new ArrayList<String>();
l2.add("ffmpeg");
l2.add("-y");
l2.add("-loop");
l2.add("1");
l2.add("-i");
l2.add(strngs[1]);
l2.add("-i");
l2.add(strngs[2]);
l2.add("-t");
l2.add(strngs[3]);
l2.add("-r");
l2.add("1/2");
l2.add("-preset");
l2.add("superfast");
l2.add("-tune");
l2.add("zerolatency");
l2.add("-pass");
l2.add(Integer.valueOf(pass).toString());
l2.add("-vcodec");
l2.add("libx264");
l2.add("-b:v");
l2.add("200k");
l2.add("-bt");
l2.add("50k");
l2.add("-threads");
l2.add("0");
l2.add("-b_strategy");
l2.add("1");
if(pass ==1){
l2.add("-an");
} else {
l2.add("-acodec");
l2.add("copy");
}
l2.add("-f");
l2.add("mp4");
l2.add("-strict");
l2.add("-2");
l2.add("-passlogfile");
l2.add(strngs[4]);
if(pass ==1){
l2.add("/dev/null");
} else {
l2.add(strngs[5]);
}
return l2;
}
答案 2 :(得分:0)
您可以尝试使用recordvideo的硬件编码器。即使您没有构建整个系统,也可以下载和编译stagefright命令行工具。您将需要系统库(来自您的设备)进行链接。生成的可执行文件将YUV缓冲区转换为mp4。您仍然需要将JPEG系列转换为单个YUV文件。我认为使用ffmpeg会很快,但您也可以使用libjpeg-turbo for android。