MediaCodec录制时间缩短、变色怎么办?

大家好,关于MediaCodec录制时间缩短、变色怎么办?很多朋友都还不太明白,今天小编就来为大家分享关于的知识,希望对各位有所帮助!

一、录像变色

在探讨这个问题之前,我们先了解一下MediaCodec的两种编码模式:

ByteBuffer模式(手动文件): 格式:COLOR_FORMAT 对应的值为MediaCodecInfo.CodecCapability.COLOR_FormatYUV420SemiPlanar(图像格式NV21)。操作:通过MediaCodec.dequeueInputBuffer()获取数据输入缓冲区,然后通过MediaCodec.queueInputBuffer()手动将YUV图像传递给MediaCodec。 Surface模式(自动文件) :格式:COLOR_FORMAT 对应的值为MediaCodecInfo.CodecCapability.COLOR_FormatSurface。操作:通过MediaCodec.createInputSurface()创建编码数据源Surface,然后通过OpenGL纹理将相机预览图像绘制到Surface上。

1、现象

相机预览正常,但录制的mp4视频颜色很暗。

说明:与YUV图像的u/v反转的效果相同。

2、分析

ByteBuffer模式下,从摄像头获取原始NV21图像,并将COLOR_FORMAT设置为COLOR_FormatYUV420SemiPlanar交给MediaCodec。结果在不同的Android设备上,有正常,有异常(少数)。起初我以为是的,有些设备不支持这种COLOR_FORMAT,但事实并非如此。 stackoverflow的某国外人对这个问题的解释如下:

相机输出和MediaCodec 输入使用的YUV 格式的U/V 平面交换。如果您能够通过Surface 移动数据,则可以避免此问题;但是,您将失去检查YUV 数据的能力。从相机录制到.mp4 文件的示例可以在bigflake 上找到。有关颜色空间以及如何交换它们的一些详细信息在此答案中.注意:stackoverflow 文章链接:https://stackoverflow.com/questions/19915962/android-mediacodec -video-wrong-color-and-playing-too-fast(打开新窗口)

MediaCodec录制时间缩短、变色怎么办?

所以,这是MediaCodec本身的一个bug。它将交换输入YUV 图像的u/v。有两种解决方案:

使用ByteBuffer模式,在将NV21图像传递给MediaCodec之前,首先将NV21转换为NV12(毕竟这两个产品只是u/v相反),但是正如之前提到的,只有少数设备会出现这种情况,适应一下可能相当窒息地起身。不建议使用Surface模式,这样可以完美避免这种情况,但同时会失去处理原始YUV图像的能力。然而,可以使用OpenGL方法来处理图像。推荐

3、实现

一般步骤如下:

一方面,使用OpenGL纹理创建纹理,并将其作为SurfaceTexture包装到相机上作为预览窗口,这样相机图像就会渲染在纹理上。另一方面,使用mMediaCodec.createInputSurface()作为MediaCodec的编码数据源。最后,在相机预览时,将纹理上的图像绘制到inputSurface。描述:相机—TextureId(OpenGL) —InputSurface(MediaCodec)

具体实现可以参见bigflake的Demo(CameraToMpegTest):https://www.bigflake.com/mediacodec/CameraToMpegTest.java.txt(opens new window)

二、录像时长缩水(丢帧)

解决这个问题有两个关键:

时间戳对齐:ByteBuffer模式:通过MediaCodec.queueInputBuffer()手动将YUV图像传递给MediaCodec时,需要传递当前时间戳。请注意,时间单位是微秒(us)。 Surface模式:MediaCodec.createInputSurface()创建的inputSurface会有mEGLDisplay和mEGLSurface与之比较。在执行EGL14.eglSwapBuffers(mEGLDisplay, mEGLSurface)之前,MediaCodec被EGLExt.eglPresentationTimeANDROID(mEGLDisplay, mEGLSurface, nsecs)修改。 inputSurface 的数据集时间戳。媒体格式配置:必须适当配置MediaFormat的关键帧间隔(KEY_I_FRAME_INTERVAL)和帧速率(KEY_FRAME_RATE)。注:这是核心摘要。您可以跳过它并稍后再阅读。以后再回头看就更容易理解了。

MediaCodec录制时间缩短、变色怎么办?

1、现象

录制10 秒视频。从设备中提取后,使用播放器进行播放和观察。发现有些设备正常,但有些设备录制的视频只有一半长度。这就是网上流传的播放速度过快的问题。

安利:OnlyStopWatch_x64.exe 这是一个定时器小工具,对于视频录制、直播等需要观察时间快慢的场景非常有用。画面丢失、播放速度过快等问题很容易看出。

2、分析

在前面提到的stackoverflow Q&A 中,外国人也表达了他对于使用MediaCodec 录制的视频播放速度太快的问题的解释:

.原始H.264 基本流中没有时间戳信息。您需要将时间戳通过解码器传递到MediaMuxer 或用于创建最终输出的任何内容。如果不这样做,播放器将只选择一个速率,或者可能尽可能快地播放帧。注:stackoverflow文章链接:https://stackoverflow.com/questions/19915962/android-mediacodec-video-wrong-color-and-playing-too-fast(打开新窗口)

他认为H.264不包含时间戳信息。您需要通过编码器(MediaCodec)将时间戳交给媒体复用器(MediaMuxer)。否则,播放器将选择速率并尽快播放帧。

3、实现

MediaCodec录制时间缩短、变色怎么办?

如果是ByteBuffer模式,核心代码实现如下:

私有无效feedMediaCodecData(byte[] data) { if (!isEncoderStart) return; int 缓冲区索引=-1;尝试{ bufferIndex=mMediaCodec.dequeueInputBuffer(0); } catch (IllegalStateException e) { e.printStackTrace(); } if ( bufferIndex=0) { ByteBuffer buffer=null; if (Build.VERSION.SDK_INT=Build.VERSION_CODES.LOLLIPOP) { 尝试{ buffer=mMediaCodec.getInputBuffer(bufferIndex); } catch (Exception e) { e.printStackTrace(); } } else { if (inputBuffers !=null) { buffer=inputBuffers[bufferIndex]; } } if (buffer !=null) { buffer.clear();缓冲区.put(数据);缓冲区.clear(); //秒(ns) 到微秒(us) mMediaCodec.queueInputBuffer(bufferIndex, 0, data.length, System.nanoTime()/1000, MediaCodec.BUFFER_FLAG_KEY_FRAME);此时请注意MediaCodec所需的时间单位是微秒(us),如果没有使用正确的时间,可能会出现问题,例如:https://stackoverflow.com/questions/20475332/mediacodec -h264-encoder-not-working-on-snapdragon-800-devices(打开新窗口)

补充:秒(s)、毫秒(ms)、微秒(us)、纳秒(ns)都是1:1000。

如果是Surface模式,核心代码实现如下:

//更新纹理图像//获取新的输入帧,并将其渲染到Surface。如果我们有一个GLSurfaceView,我们可以切换EGL 上下文并再次调用drawImage() 将其渲染在屏幕上。通过将GLSurfaceView 的EGLContext 作为eglCreateContext() 的share_context 参数传递,可以在上下文之间共享纹理。mSurfaceTexture.updateTexImage();mSurfaceTexture.getTransformMatrix(mSTMatrix); //传入时间戳信息//根据SurfaceTexture 的时间戳设置呈现时间戳。 MediaMuxer 将使用它来设置视频中的PTS。 mInputSurface.setPresentationTime(mSurfaceTexture.getTimestamp());//将其提交给编码器。如果输入已满,eglSwapBuffers 调用将会阻塞,如果输入一直保持满状态直到我们将输出缓冲区出队(我们不能这样做,因为我们被困在这里),那么情况会很糟糕。只要我们在提供额外输入之前完全耗尽编码器,系统就保证我们可以提供另一个帧而不会阻塞.mInputSurface。交换缓冲区();具体实现可以参见bigflake的Demo(CameraToMpegTest):https://www.bigflake.com/mediacodec/CameraToMpegTest.java.txt(opens new window)

用户评论

MediaCodec录制时间缩短、变色怎么办?
あ浅浅の嘚僾

我的メディアコーデック最近录制的东西颜色总是不对!以前还好,现在感觉视频暗了好多,而且时长也縮短不少。我好烦啊!不知道是不是更新的问题?

    有10位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
青衫故人

这个媒體编碼器问题真是让人头疼啊,怎么录制出来的视频总是颜色不准啊,有时候还缩短时间,真难搞定。希望有高手出来分享一下解决方法。

    有18位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
苏樱凉

我遇到相同的问题了!MediaCodec录制的视频最近颜色偏黄而且时长不够长,简直要气死我了! 每次都得去后期调色修剪,效率太低了,有没有更好的解决办法啊?

    有11位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
〆mè村姑

我也遇到了媒体编碼器录像缩水并变色的问题,一开始以为是我的设备坏了…后来发现大家好像都在遇到同一个问题了。感觉这个问题挺严重的说!希望厂商能尽快修复。

    有8位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
水波映月

这个MediaCodec录制时长缩水又变色真让人抓狂啊!我的视频本来就很精彩,现在颜色偏差这么大,简直不能看。真是影响创作的热情啊!希望有人能找到解决方法!

    有19位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
寻鱼水之欢

最近用MediaCodec编码视频发现颜色会偏离很多,严重影响了后期制作效果。 而且时长也缩短了不少,浪费好多时间。希望官方能够尽快出版本更新修复这些问题!

    有11位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
见朕骑妓的时刻

媒体编碼器这个bug真讓人糟心啊,刚录完视频就发现颜色变浅了,还少了部分内容呢!真是难以接受这种质量的错误!希望可以提供一些解决方案或者更新版本修复这个问题。

    有11位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
ー半忧伤

我以为只有我的 MediaCodec 出问题了呢!没想到很多人都在遇到时长缩水和颜色变色的问题啊!看来是这个程序本身的问题吧。 希望官方能看到大家的反馈,尽快解决这些问题。

    有10位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
清羽墨安

别的不说,MediaCodec 这个东西真的太坑了。 用起来很慢还容易崩溃,颜色偏差很大,长度也有问题…我打算换别的编码软件用了。

    有11位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
汐颜兮梦ヘ

我也遇到过类似的问题,感觉 MediaCodec 真的很不稳定啊! Sometimes it works fine, sometimes the colors are all wrong. Sometimes the duration is shortened. It's really frustrating! I hope they can fix these bugs soon.

    有11位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
你瞒我瞒

我强烈建议大家不要使用 MediaCodec,它真的太让人头疼了! 我已经尝试了很多方法,但还是不能解决时长的缩短和颜色变色问题。 使用其他编碼器软件效果会更好。

    有8位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
寂莫

我已经把MediaCodec的更新安装下来了,希望能够解决这个问题。我可是一个非常依靠 MediaCodec 的用户啊,如果它出了问题真的没办法工作!

    有9位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
墨城烟柳

我在网上搜索了一下,很多人也遇到媒体编碼器颜色偏差和时长缩短的问题!看来这可能是 MediaCodec 在某个版本的更新后导致的bug吧! Hopefully we’ll see a fix soon.

    有18位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
莫阑珊

我以前用的 mediacodec 很好用啊,最近怎么出现这些问题了?视频颜色不对,而且时长也变短了。希望官方能尽快解决这个问题啊!

    有12位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
执念,爱

如果使用 MediaCodec 录制视频的颜色偏差和时长缩短的问题没有办法解决的话,我只能被迫去寻找其他替代方案了。 这已经影响到我的工作效率了!

    有20位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
走过海棠暮

感觉 MediaCodec 越来越不靠谱了,现在连基本的编码功能都做不好! 我怀疑是不是代码写的不规范导致的? 真的希望官方能重视这个问题,早日修复 bugs .

    有8位网友表示赞同!

MediaCodec录制时间缩短、变色怎么办?
爱情的过失

MediaCodec一直是我常用的软件,但最近遇到了很多问题。录制视频的颜色会偏暗,时长也缩短了好多,这是怎么回事啊?有没有大神知道怎么解决呀?在线等 急求帮助!

    有13位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/110816.html

(0)
小su的头像小su
上一篇 2024年8月30日 下午4:46
下一篇 2024年8月30日 下午4:56

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注