我正在尝试解码文件中的视频,并使用API Level 21及更高版本(Android OS 5.0 Lollipop)支持MediaCodec的新异步模式将其编码为不同的格式.
在Big Flake,Google的Grafika等网站上以同步模式执行此操作有很多示例,并且StackOverflow上有许多答案,但它们都不支持异步模式.
我不需要在此过程中显示视频.
我相信一般的程序是用一个读取文件MediaExtractor作为MediaCodec(解码器)的输入,允许解码器的输出渲染成一个Surface也是共享输入到MediaCodec(编码器),然后最后写入编码器输出文件通过MediaMuxer.它Surface是在编码器设置期间创建的,并与解码器共享.
我可以将视频解码为a TextureView,但Surface与编码器共享而不是屏幕也没有成功.
我MediaCodec.Callback()为我的两个编解码器设置了s.我认为问题在于我不知道在Encoder的回调onInputBufferAvailable()函数中该怎么做.我不知道(或知道如何)将数据从Surface编码器复制到编码器中 - 这应该自动发生(就像在解码器输出上一样codec.releaseOutputBuffer(outputBufferId, true);).然而,我认为onInputBufferAvailable需要打电话codec.queueInputBuffer才能运作.我只是不知道如何设置参数而不从像MediaExtractorDecode端使用的那样获取数据.
如果您有一个打开视频文件MediaCodec的示例,对其进行解码,使用异步回调将其编码为不同的分辨率或格式,然后将其保存为文件,请分享您的示例代码.
=== 编辑 ===
下面是我在异步模式下尝试做的同步模式的一个工作示例:ExtractDecodeEditEncodeMuxTest.java:https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media /src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java这个例子在我的应用程序中工作
android video-encoding mediacodec android-5.0-lollipop android-5.1.1-lollipop
我正在尝试使用 MediaCodec 在 Android 上对 h264 视频进行编码以进行实时视频流,但 dequeueOutputBuffer 持续花费很长时间(实际上它有时非常快,但有时非常慢,请参阅下面的日志输出)。我已经看到它甚至需要 200 毫秒才能准备好输出缓冲区。我的代码有问题吗,或者您认为这是 OMX.Nvidia.h264.encoder 的问题吗?
也许我需要将图像从 1280x720 缩小到更小?或者我可能需要在等待输出缓冲区时将更多输入缓冲区出列和排队?(有 6 个输入和 6 个输出缓冲器可用)。我使用的是 Android API 19,因此无法使用异步 MediaCodec 处理方法。我实际上是从 Google Project Tango 平板电脑流式传输图像,所以我的另一个怀疑是可能 Tango 的后台操作花费的时间太长并导致编码器变慢。关于什么可能会减慢这种速度的任何想法?
01-20 23:36:30.728 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 0.400666ms.
01-20 23:36:30.855 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 94.290667ms.
01-20 23:36:30.880 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 0.57ms.
01-20 23:36:30.929 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 4.878417ms.
01-20 23:36:31.042 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 77.495417ms.
01-20 23:36:31.064 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 0.3225ms.
01-20 23:36:31.182 2920-3014/com.... D/StreamingThread: dequeueOutputBuffer took 74.777583ms. …Run Code Online (Sandbox Code Playgroud) encoding android h.264 google-project-tango android-mediacodec