MediaCodec编码后的视频时间不正确的问题

jerry_agle 2015-11-05 03:43:28
本人android新手一枚, 最近在做摄像头录像的时候,用MediaCodec编码摄像头的yuv数据成h264, 但是发现编码后的h264文件时间不对..比如录像录了20秒,但是h264文件就只有12秒..视频播放速度加快了..但是在摄像头fps和编码器fps设置都是一样的25, h264文件属性里面显示的也是25fps.. 所以很困惑,想问问这是什么原因..望大牛指导.. 编码代码如下:


ByteBuffer[] iBufs = mMediaCodec.getInputBuffers();
ByteBuffer[] oBufs = mMediaCodec.getOutputBuffers();

long audioAbsolutePtsUs = System.nanoTime() / 1000;

int iIdx = mMediaCodec.dequeueInputBuffer(-1);
if (iIdx >= 0) {
ByteBuffer iBuf = iBufs[iIdx];
iBuf.clear();
iBuf.put(in);
mMediaCodec.queueInputBuffer(iIdx, 0, in.length, audioAbsolutePtsUs, 0);
}

MediaCodec.BufferInfo bufInfo = new MediaCodec.BufferInfo();
int oIdx = mMediaCodec.dequeueOutputBuffer(bufInfo, 0);
while (oIdx >= 0) {
ByteBuffer oBuf = oBufs[oIdx];
byte[] out = new byte[bufInfo.size];
oBuf.get(out);
mOutput.write(out, 0, out.length);

mMediaCodec.releaseOutputBuffer(oIdx, false);
oIdx = mMediaCodec.dequeueOutputBuffer(bufInfo, 0);
}
...全文
1212 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
duguju 2018-08-28
  • 打赏
  • 举报
回复
原因及解决方案,可能会帮到楼主:
https://blog.csdn.net/duguju/article/details/82149856
hdyip 2017-09-07
  • 打赏
  • 举报
回复
我个人建议,你还是趁早放弃android 视频硬解码,我也不做多解释为什么。估计我这样说会要吧一堆喷子喷我。我建议你还是多看看视频软解码吧。祝你好运。
Ghost_war 2016-11-28
  • 打赏
  • 举报
回复
楼主,问题解决了么?我也遇到了同样的问题,我的是录制了10秒的视频,用播放器播放有7秒,但是我硬解码出来后只有4秒,但是不管那个情况,视频的内容没有少,都是播放速度变快了......
明日复日明 2016-03-21
  • 打赏
  • 举报
回复
楼主,我这边int oIdx = mMediaCodec.dequeueOutputBuffer(bufInfo, 0)总是-1怎么办。。。
jerry_agle 2016-02-01
  • 打赏
  • 举报
回复
引用 5 楼 u010607906 的回复:
如果丢帧了那会导致播放加快。你在除了做编码还有串行做其他操作吗?我试过的编码效率平均是接近30fps 的
没有其他操作.. 我用meidaCodec在android 4.3上,很多手机可以达到30fps.. 但是android 4.1, API 16, meidaCodec+buffer模式,很多无法达到30fps,一些配置低的手机,就只有8fps左右.. 还有请教一个问题, 还是在API 16环境下, 大概编码到一多分钟之后, 会出现丢帧的情况,大概会丢调1秒钟左右的数据.. 这个出现的概率还是挺大,不同的手机会出现..我一时还没想到原因所在.
jerry_agle 2016-02-01
  • 打赏
  • 举报
回复
引用 6 楼 ydbcsdn 的回复:
很正常, 可能是软件压缩,CPU跟不上节奏。
用的android系统媒体库MediaCodec, 这个是硬编码
Yao-debo 2016-01-15
  • 打赏
  • 举报
回复
很正常, 可能是软件压缩,CPU跟不上节奏。
xiaovid_ 2016-01-15
  • 打赏
  • 举报
回复
如果丢帧了那会导致播放加快。你在除了做编码还有串行做其他操作吗?我试过的编码效率平均是接近30fps 的
jerry_agle 2015-11-09
  • 打赏
  • 举报
回复
引用 1 楼 mw_meng_wei2 的回复:
audioAbsolutePtsUs好像不是这样计算的 long timestamp = mFrameIndex++ * 1000000/ FRAME_RATE; mFrameIndex从0开始
发现MediaCodec每秒最多只能编码15fps的视频到h264..真是奇怪啊
jerry_agle 2015-11-06
  • 打赏
  • 举报
回复
引用 1 楼 mw_meng_wei2 的回复:
audioAbsolutePtsUs好像不是这样计算的 long timestamp = mFrameIndex++ * 1000000/ FRAME_RATE; mFrameIndex从0开始
还是不行, 录制后播放速度仍然很快
jerry_agle 2015-11-06
  • 打赏
  • 举报
回复
引用 楼主 jerry_agle 的回复:
本人android新手一枚, 最近在做摄像头录像的时候,用MediaCodec编码摄像头的yuv数据成h264, 但是发现编码后的h264文件时间不对..比如录像录了20秒,但是h264文件就只有12秒..视频播放速度加快了..但是在摄像头fps和编码器fps设置都是一样的25, h264文件属性里面显示的也是25fps.. 所以很困惑,想问问这是什么原因..望大牛指导.. 编码代码如下: ByteBuffer[] iBufs = mMediaCodec.getInputBuffers(); ByteBuffer[] oBufs = mMediaCodec.getOutputBuffers(); long audioAbsolutePtsUs = System.nanoTime() / 1000; int iIdx = mMediaCodec.dequeueInputBuffer(-1); if (iIdx >= 0) { ByteBuffer iBuf = iBufs[iIdx]; iBuf.clear(); iBuf.put(in); mMediaCodec.queueInputBuffer(iIdx, 0, in.length, audioAbsolutePtsUs, 0); } MediaCodec.BufferInfo bufInfo = new MediaCodec.BufferInfo(); int oIdx = mMediaCodec.dequeueOutputBuffer(bufInfo, 0); while (oIdx >= 0) { ByteBuffer oBuf = oBufs[oIdx]; byte[] out = new byte[bufInfo.size]; oBuf.get(out); mOutput.write(out, 0, out.length); mMediaCodec.releaseOutputBuffer(oIdx, false); oIdx = mMediaCodec.dequeueOutputBuffer(bufInfo, 0); }
仍然不行, 录完之后播放速度还是很快..
mw_meng_wei2 2015-11-06
  • 打赏
  • 举报
回复
audioAbsolutePtsUs好像不是这样计算的 long timestamp = mFrameIndex++ * 1000000/ FRAME_RATE; mFrameIndex从0开始

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧