如何在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(¶m, "preset", "slow", 0);
/**
*
* ultrafast,superfast, veryfast, faster, fast, medium
* slow, slower, veryslow, placebo. This is x264 encoding speed parameter
*/
av_dict_set(¶m, "preset", "superfast", 0);
av_dict_set(¶m, "tune", "zerolatency", 0);
}
if (avcodec_open2(pCodecCtx, pCodec, ¶m) < 0) {
loge("Failed to open encoder!n");
return -1;
}
您需要设置预设超高速或超快