我在参考上一个问题here时提出这个问题
由于我无法解决摩托罗拉xoom设备中mp4文件的最后一帧的所有权问题,我想到尝试逐帧解码版本,我可以在某种程度上控制解码器的输入,并且可以知道它到达结束时流。
为此我写了一个派生mediasource的类并重写了read函数
当我实施它时,再次在Karbonn A9 +设备中它工作得有点好。但是在motorola xoom中,解码器似乎花费了太多时间用于所有分辨率,并且在每3-4帧后,读取返回以下错误。
09-06 11:49:47.663: E/OMXCodec(1281): [OMX.Nvidia.h264.decode]
Timed out waiting for output buffers: 0/1
获得一帧需要3秒钟,否则大约需要1.8秒 我很少在karbonn设备中遇到同样的问题。
以下是我设置元数据的代码
err = calc_avcc_from_file(video_file, length_file, avcc);
len_avcc = sps_size + pps_size + 11;
//err = parseAVCCodecSpecificData(avcc, (size_t)len_avcc);
LOGP("avcc size = %d and error of parseAVCCodecSpecificData %d", len_avcc, err);
meta_data->setData(kKeyAVCC, kTypeAVCC, avcc, (size_t)len_avcc);
meta_data->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
meta_data->setInt32(kKeyWidth, mDisplayWidth);
meta_data->setInt32(kKeyHeight, mDisplayHeight);
meta_data->setInt32(kKeyFrameRate, 29);
meta_data->setInt32(kKeyBitRate, 15000);
meta_data->setInt32(kKeyStride, mDisplayWidth);
meta_data->setInt32(kKeySliceHeight, mDisplayHeight);
实际上一开始我没有通过avcc,同样的问题就在那里。然后我想通过创建如下传递它,但没有找到改进。
int custom_decoder::calc_avcc(char *enc_strm, int enc_param_len, void *avcc)
{
int err = OFI_VC_ERR_SUCCESS;
char *temp = (char *)avcc;
LOGP("calculating avcc");
err = calc_sps_pps_size (enc_strm, enc_param_len);
*temp++ = 1;
*temp++ = 66;
*temp++ = 66;
*temp++ = 1;
*temp++ = 3;
*temp++ = 1;
*temp++ = 0;
*temp++ = sps_size;
memcpy(temp, sps_data, sps_size);
temp += sps_size;
*temp++ = 1;
*temp++ = 0;
*temp++ = pps_size;
memcpy(temp, pps_data, pps_size);
return err;
}
我错过了什么或出了什么问题...... 任何帮助将不胜感激....