android 如何快速将jpeg图像编码为H264(将图像转换为视频)

68bkxrlz  于 2022-11-03  发布在  Android
关注(0)|答案(3)|浏览(456)

我有30张JPEG图像(.jpg),分辨率为480 x 640。每张图像需要大约20 KB(所有图像都需要大约600 KB)。
我正在使用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应用程序中运行这些命令,其中我有ffmpeg可执行文件,使用的是ProcessBuilder。
回复1(给罗伯特·朗特里):

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;
vxqlmq5t

vxqlmq5t1#

去掉-r1/5怎么样?它加快了我的编码速度。

zour9fqk

zour9fqk2#

IMO - ffmpeg在android上仍然是全软件(没有GPU或硬件加速)。你可以尝试通过libstagefright/ffmpeg组合questions来查看。无论如何,如果你对快速感兴趣,你应该在android上找到一个硬件加速解决方案。否则ffmpeg在受限平台(电池寿命,低功耗CPU)上与其他平台相比会相当慢。
另请参阅此处的接受答案和this too
我放弃了android,因为速度不够快,我选择了一个云示例来上传媒体,然后在下载到android设备之前在那里进行ffmpeg编码。
顺便说一句,在放弃Android的编码之前,我使用了下面的2遍H264表达式。

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;
}
xsuvu9jc

xsuvu9jc3#

您可以尝试使用recordvideo的硬件编码器。您可以下载并编译stagefright命令行工具,即使您没有构建整个系统。您将需要系统库(从你的设备)链接。产生的可执行文件将YUV缓冲区转换成mp4。你仍然需要将一系列的JPEG转换成一个单一的YUV文件。我认为用ffmpeg会足够快,但也可以使用libjpeg-turbo for android

相关问题