我正在尝试将数据(h.264原始1080p)传输到android并将其渲染到表面视图。问题是如果我发送的数据快于45fps,则解码器输出会像素化(输入索引和输出) index是-1还是没有准备好)
此外,如果我发送720p或更低分辨率的视频,结果是相同的,我无法渲染(没有像素化)比45fps快。
但是如果我在releaseOutputBuffer()中将render标志设置为“False”,我可以达到75fps(我收到的输入和输出索引是正常的)
那么有没有办法“解锁”帧速率?或另一种渲染速度更快的方法。
注意:我在ndk中这样做。
初始化解码器()
AMediaFormat *AVm_format = AMediaFormat_new();
AMediaFormat *AVm_formattesting = AMediaFormat_new();
AVm_codec = AMediaCodec_createDecoderByType("video/avc");
AVm_formattesting =AMediaCodec_getOutputFormat(AVm_codec);
int formatint=0;
AMediaCodec_createCodecByName("OMX.qcom.video.decoder.avc");
AMediaFormat_setString(AVm_format,AMEDIAFORMAT_KEY_MIME,"video/avc");
AMediaFormat_setInt32(AVm_format,AMEDIAFORMAT_KEY_HEIGHT,1920);
AMediaFormat_setInt32(AVm_format,AMEDIAFORMAT_KEY_WIDTH,1080);
AMediaFormat_setInt32(AVm_format,AMEDIAFORMAT_KEY_COLOR_FORMAT,13);
try {
AMediaCodec_configure(AVm_codec, AVm_format, Nwindow, NULL, 0);
LOGD("Configure finished...\n");
AMediaCodec_start(AVm_codec);
LOGD("Decoder started\n");
}catch(std::exception e){
LOGD("FAILED TO CONFIGURE DECODER\n");
}
解码(...)
//pData is the frame I recive
//sz is the size of the frame
ssize_t indx = AMediaCodec_dequeueInputBuffer(AVm_codec, 0);
if (indx >= 0) {
input = AMediaCodec_getInputBuffer(AVm_codec, indx, &insize);
// memset(input,0,sz);
memcpy(input,pData,sz);
AMediaCodec_queueInputBuffer(AVm_codec, indx, 0, sz, 0, 0);
}
ssize_t indy = AMediaCodec_dequeueOutputBuffer(AVm_codec, AVm_buffinfo, 0);
if (indy >= 0) {
AMediaCodec_releaseOutputBuffer(AVm_codec, indy, false);
} else if(indy == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED){
LOGD("output buffers changed\n");
} else if (indy == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED) {
AMediaFormat *format = NULL;
format = AMediaCodec_getOutputFormat(AVm_codec);
LOGD("format changed to: %s", AMediaFormat_toString(format));
AMediaFormat_delete(format);
LOGD("format changed to:\n");
} else if (indy == AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
LOGD("no output buffer right now\n");
} else {
LOGD("unexpected info code: %zd\n", indy);
}
如果还有其他需要,请告诉我。
答案 0 :(得分:0)
我不完全确定发生了什么 - 将解码帧传送到SurfaceView的速率不应影响输出质量。这听起来更像是数据被馈送到解码器的方式的问题,例如,你正在覆盖仍在读取的H.264数据缓冲区。
发送到SurfaceView的Surface的帧不会被删除,因此如果您尝试以比设备刷新率更快的速度提供帧,则releaseOutputBuffer(..., true)
将阻止。在大多数设备上,这是60fps。您可以在graphics architecture doc中了解有关系统工作方式的更多信息。
要记住的一点是,解码后的视频帧不会被releaseOutputBuffer()
呈现,而是转发。 IPC交易有一些成本,但我预计你所看到的大部分是呼叫阻塞对每帧保持稳定16.7ms的影响。