标签: android-mediacodec

Android MediaCodec 视频颜色错误且播放速度太快

我正在使用相机的 setPreviewCallback 使用 MediaCodec 编码视频。(我按照这个示例使用 Android MediaCodec 从相机编码 H.264)。我对 MediaCodec 使用以下设置:

mediaCodec = MediaCodec.createEncoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 1280, 720);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 8000000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mediaCodec.start();
Run Code Online (Sandbox Code Playgroud)

我的相机设置是:

Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewFormat(ImageFormat.NV21);
parameters.setPictureSize(previewWidth, 1280);
parameters.setPreviewSize(previewWidth, 720);
parameters.setPreviewFrameRate(30);
parameters.setPreviewFpsRange(5000,30000);
mCamera.setParameters(parameters);
Run Code Online (Sandbox Code Playgroud)

我有视频,但有两个问题:

  1. 它的颜色是错误的。
  2. 播放速度太快了。

这是一个示例视频

http://www.youtube.com/watch?v=I1Eg2bvrHLM&feature=youtu.be

有谁知道这两个问题的原因是什么吗?可能会告诉我一些解决这个问题的方法,因为我现在完全迷失/困惑了。感谢您的阅读,并感谢任何评论和意见。

android yuv android-camera android-mediacodec

1
推荐指数
1
解决办法
3012
查看次数

android SDK中MediaExtractor、MediaCodec和MediaMuxer之间的关系是什么?

我正在尝试在 Android 上的视频样本上进行一些深度学习实验。我已经陷入了重新混合视频的困境。我有几个问题要在脑海中安排信息:)我已经阅读了一些页面: https: //vec.io/posts/android-hardware-decoding-with-mediacodechttps://bigflake.com/mediacodec/ #ExtractMpegFramesTest但我仍然一团糟。

我的问题:

  1. 我可以读取视频MediaExtractor,然后传递数据以MediaMuxer将视频保存在另一个文件中吗?不使用MediaCodec?
  2. 如果我想在保存之前修改帧,我可以在不使用 的情况下做到这一点吗Surface?只需修改ByteBuffer? 我假设我需要解码来自 的数据MediaExtractor,然后修改内容,然后将其编码为MediaMuxer
  3. 与方法上下文中的sample相同吗?frameMediaExtractor::readSampleData
  4. 我需要解码样本吗?

android mediaextractor mediamuxer android-mediacodec

1
推荐指数
1
解决办法
422
查看次数

是否可以/如何将 MediaCodec 解码帧直接提供给 MediaCodec 编码器?

我的目标是拼接多个视频文件中的视频片段。片段由任意开始时间和结束时间定义。最初我想使用像 mp4parser 这样的库来做到这一点,但它只能在同步(IFRAME)点切割流,而我需要更高的精度。

我的场景是从文件中提取编码流 -> 解码 -> 编码 -> 将结果混合到 mp4 文件中。目前,代码通常可以工作,但生成的视频是白噪声。在 Nexus-S 和 Galaxy-S3 上进行了测试。我的代码是几个示例的组合:

  • 基于MoviePlayer.java读取之前录制的文件
  • 解码-编码:DecodeEditEncodeTest.java
  • 将视频流复用为 mp4 - 又一个示例,此处不相关

我想简化示例,因为我不需要在中间处理帧。我尝试将缓冲区从解码器输出馈送到编码器输入,而中间没有 Surface。整个过程的工作原理是代码运行完成并生成可播放的视频文件。然而文件的内容是白噪声。

这是将帧从解码器提供给编码器的代码片段。有什么问题以及如何使其发挥作用?

...
} else { // decoderStatus >= 0
    if (VERBOSE) Log.d(TAG, "surface decoder given buffer "
                            + decoderStatus + " (size=" + info.size + ")");
    // The ByteBuffers are null references, but we still get a nonzero
    // size for the decoded data.
    boolean doRender = (info.size != 0);
    // As soon as we call …
Run Code Online (Sandbox Code Playgroud)

video android video-processing grafika android-mediacodec

0
推荐指数
1
解决办法
2120
查看次数

使用 MediaMuxer 编码 MP4 文件,但在调用 mediaMuxer.stop() 时崩溃

我使用 MediaMuxer 和 MediaCodec 将相机和音频中的视频(H264)数据和音频(AAC-LC)数据编码为 MP4 文件。但 MediaMuxer 对象有时会崩溃mediaMuxer.stop(),错误日志为

11-03 16:28:36.956: A/DEBUG(711): Abort message: 'frameworks/av/media/libstagefright/MPEG4Writer.cpp:2983 CHECK_LT( mCodecSpecificDataSize + 23,128) failed: 399 vs. 128'
11-03 16:28:36.957: A/DEBUG(711):     x0   0000000000000000  x1   0000000000001184  x2   0000000000000006  x3   0000000000000000
11-03 16:28:36.957: A/DEBUG(711):     x4   0000000000000000  x5   0000000000000001  x6   0000000000000000  x7   0000000000000000
11-03 16:28:36.957: A/DEBUG(711):     x8   0000000000000083  x9   0000000000000000  x10  0000000000000000  x11  0000007f91bb0df8
11-03 16:28:36.958: A/DEBUG(711):     x12  0000007f91bb0cd0  x13  0000000000000077  x14  0000007f91bb0ea8  x15  0000000000000000
11-03 16:28:36.958: A/DEBUG(711):     x16  0000007faca8d6a8  x17  0000007faca4fb2c  x18  0000007face14418  x19  0000007f91bb3510 …
Run Code Online (Sandbox Code Playgroud)

video android mediamuxer android-mediacodec

0
推荐指数
1
解决办法
1157
查看次数