Android内置相机编码器VS FFMPEG -速度



如何在android相机应用程序中记录1080P, H264编码的视频是实时快速的,但在android中使用FFMPEG编码视频在相同的视频大小是缓慢的?

我知道FFMPEG是一个软件级编码器,它不支持任何硬件功能。

我知道相机应用程序直接从相机驱动程序获取缓冲区数据。

但实际上差异发生在哪里??

为什么相机应用程序是实时快??

它是否使用手机的GPU和OpenGL功能来编码视频,使其如此实时快速??

因为相机应用程序和FFMPEG都运行在同一移动设备上,但仍然相机实时编码H264 ??

我知道FFMPEG是一个软件级编码器,它不支持任何硬件功能。

你基本上已经自己回答了这个问题。许多设备都有硬件编解码器,它们不依赖于通常的CPU指令进行任何编码。FFmpeg不会利用这些。(我相信你可以在FFmpeg中构建硬件优化,尽管我不确定它们在Android上的可用性。)

FFMPEG在ARM平台上默认支持NEON优化,因此在QVGA或VGA等分辨率下不太可能看到差异。但是用于视频编码的片上硬件在1080P这样的高分辨率下要快得多,并且最低限度地利用了ARM MHz。请注意,编码器使用的HW与OpenGL HW引擎不同。

如果这样配置,ffmpeg可以使用可选的x264编码器;请注意,这具有可怕的许可含义。x264是非常好的和高效的,当它被构建为使用切片多线程时,它可以在现代设备上实现25FPS的WVGA视频,如三星S4。

ffmpeg可以用libstagefrihight编译,它利用内置的硬件解码器,但不幸的是不包括编码器。

我也遇到了这个问题,困扰了我很长时间。我是这样解决这个问题的:

AVDictionary *param = 0;
//H.264
if (pCodecCtx->codec_id == AV_CODEC_ID_H264) {
//        av_dict_set(&param, "preset", "slow", 0);
    /**
    * 
    * ultrafast,superfast, veryfast, faster, fast, medium
    * slow, slower, veryslow, placebo. This is x264 encoding speed parameter
    */
    av_dict_set(&param, "preset", "superfast", 0);
    av_dict_set(&param, "tune", "zerolatency", 0);
}
if (avcodec_open2(pCodecCtx, pCodec, &param) < 0) {
    loge("Failed to open encoder!n");
    return -1;
}

您需要设置预设超高速或超快

最新更新