我按照官方 Android 文档使用 MediaCodec 对象为我的音频输入设置编码器。但下面代码中的 dequeueOutputBuffer 方法始终返回 -1。这个返回值是什么意思呢?
我的代码:
/*configuarion of MediaCodec object*/
codec = MediaCodec.createEncoderByType("audio/mp4a-latm");
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, 44100);
format.setInteger(MediaFormat.KEY_BIT_RATE, 64 * 1024);
format.setInteger(MediaFormat.KEY_AAC_PROFILE,MediaCodecInfo.CodecProfileLevel.AACObjectHE);
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
codec.start();
ByteBuffer[] inputBuffers = codec.getInputBuffers();
ByteBuffer[] outputBuffers = codec.getOutputBuffers();
/*main loop to encode audio data*/
for (;;) {
int inputBufferIndex = codec.dequeueInputBuffer(-1); -->this is never zero so data should be written correctly!
if (inputBufferIndex >= 0) {
// write data from audiorecord in queue …Run Code Online (Sandbox Code Playgroud) 我想将 .wmv 视频文件转换为 mp4 视频文件。可以使用MediaMuxer和MediaCodec类吗?
有谁知道Android MediaCodec在解码HEVC时支持的分辨率是多少?
通过反复试验,我发现以下工作:
640x272
720x304
960x400
1280x528
1920x800
2560x1072
Run Code Online (Sandbox Code Playgroud)
而以下情况则不然:
512x216
3840x1600
Run Code Online (Sandbox Code Playgroud)
有官方文档吗?
我正在处理实时流,MediaCodec并且有一个场景,其中MediaFormat流中发生变化(即:正在解码的视频的分辨率发生变化)。鉴于我将解码器附加到 aSurface以在检测到传入流的分辨率变化后立即渲染它,我会在向其提供新的分辨率缓冲区之前重新创建解码器(为其提供正确的 new MediaFormat)。
我遇到了一些奇怪的错误,这些错误没有给我太多关于可能出现问题的信息,即使用MediaCodec.configure新格式和相同的调用时Surface:
android.media.MediaCodec$CodecException: Error 0xffffffea
at android.media.MediaCodec.native_configure(Native Method)
at android.media.MediaCodec.configure(MediaCodec.java:577)
Run Code Online (Sandbox Code Playgroud)
当获取它时,CodecException.getDiagnosticInfo它没有显示任何我可以真正用来理解失败原因的内容:android.media.MediaCodec.error_neg_22
我还在日志中注意到以下内容,并找到了一些相关信息,并且想知道我是否需要对其本身做一些事情Surface(例如将其与解码器的旧实例分离并将其交给新解码器):
07-09 15:00:17.217 E/BufferQueueProducer( 139): [SurfaceView] connect(P): already connected (cur=3 req=3)
07-09 15:00:17.217 E/MediaCodec( 5388): native_window_api_connect returned an error: Invalid argument (-22)
07-09 15:00:17.218 E/MediaCodec( 5388): configure failed with err 0xffffffea, resetting...
Run Code Online (Sandbox Code Playgroud) 我在尝试使用 Android 软件解码器 (OMX.google.h264.decoder) 提取和解码 H264 视频时遇到问题。该问题似乎涉及多个设备。
该视频使用 Nexus 5 硬件解码器 (OMX.qcom.video.decoder.avc) 可以正常播放。
下面的示例代码展示了该问题,并且是使用 android MediaCodec 和 MediaExtractor 类的相当标准的示例。
当第一个缓冲区传递给解码器时,我得到的异常是非法状态异常。
该视频采用 Baseline 配置文件编码为 720x480 20fps,因此应符合兼容性准则。
我非常感谢任何有关使软件视频解码器正确处理 H264 视频的指导。
public void doMp4Test()
{
try
{
//String filename = "webserver_h264.mp4";
String filename = "toodee-720p.mp4";
MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource(Constants.RootDirectory + File.separator + filename);
MediaCodec decoder = null;
for (int i = 0; i < extractor.getTrackCount(); i++)
{
MediaFormat format = extractor.getTrackFormat(i);
String mime = format.getString(MediaFormat.KEY_MIME);
if (mime.startsWith("video/"))
{
extractor.selectTrack(i);
decoder …Run Code Online (Sandbox Code Playgroud) 更新:这看起来与此相关:Image data from Android camera2 API Flipped & squished on Galaxy S5 - 我认为这是一个错误,因为 Nexus 5/6 工作正常,需要获取完整的传感器尺寸然后再获取是没有意义的手动裁剪以达到所需的宽高比,也可能不使用“支持的”输出尺寸!
问题:
编解码器输出具有正确的大小。但结果因设备而异:
有人会说,没问题。也许表面不是完全按照指定的宽度和高度创建的,或者其他什么(即使输出尺寸是专门为 MediaCodec.class 目标提取的)。
因此,我创建了一个 OpenGL 上下文,生成了一个纹理,为其创建了一个 SurfaceTexture,将其默认缓冲区大小设置为相机输出大小,并使用该纹理创建了一个 Surface。我不会详细讨论将其绘制到 TextureView 或返回到 MediaCodec 的 EGL 表面的具体细节。结果是相同的 - Camera2 捕获请求仅针对某些分辨率输出扭曲的图像。深入挖掘:在 updateTexImage 之后立即调用 SurfaceTexture 上的 getTransformMatrix - 正如预期的那样,矩阵始终是单位矩阵。
因此,这里真正的问题是相机没有按照提供的目标表面的大小进行捕捉。因此,解决方案是获取相机正在捕获的实际尺寸,其余部分是纯 GL 矩阵变换以正确绘制。但是 - 我怎样才能得到它?
注意:使用旧的相机 API,具有与目标完全相同的“预览尺寸”和相同的表面(MediaCodec 或自定义的)- …
从Grafika项目中,文件 DoubleDecodeActivity.java。我在 3 个 SurfaceView 上使用 MediaCodec API 尝试了 3 个同步视频(h264)解码器。在使用 Android 5.1 将第四个解码器添加到第四个 SurfaceView 到 Nexus 7 时崩溃,那么可以或支持多少个同时解码器。
附言。这次崩溃后,MediaCodec 不再工作。需要重启设备才能使用MediaCodec。
下面是崩溃日志。第四个解码器线程的函数崩溃decoder.start()。
com.example.app.one V/DecodeActivity: Mime: video/avc
com.example.app.one I/OMXClient: Using client-side OMX mux.
com.example.app.one V/DecodeActivity: Mime: video/avc
com.example.app.one I/OMXClient: Using client-side OMX mux.
com.example.app.one V/DecodeActivity: Mime: video/avc
com.example.app.one E/ACodec: [OMX.qcom.video.decoder.avc] storeMetaDataInBuffers failed w/ err -2147483648
com.example.app.one E/ACodec: [OMX.qcom.video.decoder.avc] storeMetaDataInBuffers failed w/ err -2147483648
com.example.app.one W/ACodec: do not know color format 0x7fa30c03 = 2141391875
com.example.app.one W/ACodec: do not …Run Code Online (Sandbox Code Playgroud) 我正在手动读取 RTP/H264 流并将 H264 帧传递给 Android MediaCodec。我使用“markerBit”作为框架的边框。MediaCodec 与 OpenGL 纹理 (SurfaceTexture) 绑定。一般来说,一切正常。但解码器似乎缓冲帧。如果我将帧放入解码器中,它不会立即渲染到纹理。当我在解码器中添加 2-3 帧后,第一帧将渲染到纹理。
我正在针对 Android 4.4.4 实施。
private static final int INFINITE_TIMEOUT = -1;
private static final int TIMEOUT_OUTPUT_BUFFER_MEDIA_CODEC = 1000;
...
int bufferIndex = codec.dequeueInputBuffer(INFINITE_TIMEOUT);
if (bufferIndex < 0) {
throw new RuntimeException("Error");
}
ByteBuffer inputBuffer = inputBuffers[bufferIndex];
inputBuffer.clear();
// Copy H264 data to inputBuffer
h264Frame.fill(inputBuffer);
codec.queueInputBuffer(bufferIndex, 0, inputBuffer.position(), 0, 0);
drainOutputBuffers();
...
Run Code Online (Sandbox Code Playgroud)
和
private boolean drainOutputBuffers() {
MediaCodec.BufferInfo buffInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = codec.dequeueOutputBuffer(buffInfo, TIMEOUT_OUTPUT_BUFFER_MEDIA_CODEC); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 mediaCodec 从 openGl ES 表面创建 mp4 视频。我有一个eglSurface,该eglSurface 的源表面是MediaCodec 输入表面。
我可以为eglSurface 设置不同的尺寸,当一种尺寸(宽度或高度)太大时:例如宽度= 5000 且高度= 512,MediaCodec 崩溃。
这是崩溃日志
android.media.MediaCodec$CodecException: Error 0xfffffc0e
at android.media.MediaCodec.native_configure(Native Method)
at android.media.MediaCodec.configure(MediaCodec.java:588)
Run Code Online (Sandbox Code Playgroud)
....
在某些设备(Galaxy s7 edge)上它不会崩溃,但生成 videoView 后不会播放视频。
对于小尺寸(例如屏幕尺寸),它可以在所有设备上正常工作
一个应用程序相当稳定。其偶尔崩溃的绝大多数是由以下代码中的 MediaCodec.release() 引起的:
mediaCodec.stop()
mediaCodec.release();
Run Code Online (Sandbox Code Playgroud)
或者
mediaCodec.reset()
mediaCodec.release();
Run Code Online (Sandbox Code Playgroud)
无法捕获异常。谁能提供一些关于如何找到补救措施的提示?以下是 Google Play 报告的一些崩溃示例:
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)
_ZNK7android7RefBase9decStrongEPKv
Motorola Moto G(4) Plus (athene_f), Android 7.0
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> net.mydomain.foo <<<
backtrace:
#00 pc 000000000000bd98 /system/lib/libutils.so (_ZNK7android7RefBase9decStrongEPKv+11)
#01 pc 00000000000c0acf /system/lib/libstagefright.so (_ZN7android10MediaCodecD1Ev+250)
#02 pc 00000000000c0cc7 /system/lib/libstagefright.so (_ZN7android10MediaCodecD0Ev+2)
#03 pc 000000000000bdc7 /system/lib/libutils.so (_ZNK7android7RefBase9decStrongEPKv+58)
#04 pc 000000000001fec7 /system/lib/libmedia_jni.so (_ZN7android11JMediaCodec7releaseEv+22)
#05 pc 00000000000233eb /system/lib/libmedia_jni.so
#06 …Run Code Online (Sandbox Code Playgroud) android ×9
h.264 ×2
android-ndk ×1
egl ×1
hevc ×1
media ×1
mediamuxer ×1
opengl-es ×1
surface ×1
video ×1