问题标签 [android-mediacodec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 将 pcm 编码为 aac 时,OMX.google.aac.encoder 在 MediaCodec 中不起作用
我在 Android 4.1 上使用 MediaCodec 将 wav 文件的 pcm 轨道编码为 aac,在我的 S3 上,有两个编码器,OMX.google.aac.encoder 和 OMX.SEC.aac.enc,如果调用 createEncoderByType,则使用第一个,但它不起作用,无法播放输出(没有声音),如果用“OMX.SEC.aac.enc”调用createByCodecName,它可以工作。在我的 HTC ONE 上,只有“OMX.google.aac.encoder”,并且不起作用。我认为我的代码没有问题,因为它是从 google 复制的,并且第二个编码器可以工作。
顺便说一句,我在 aac 流中添加了 adts 标头。
android - 在 Android 上解码 H.264 原始流错误
当我尝试在 Note3(N9005, Android 4.3) 上使用 MediaCodec 解码 H.264 原始流时,出现以下错误:
但相同的代码适用于 Note3(N900) 和 Google Nexus 7(第二代)。这是我引用的代码:http: //developer.android.com/reference/android/media/MediaCodec.html PS:我的 H.264 原始流的标头如下所示:
如果需要,我可以为您附上我的测试视频文件。
android - Android 中的 MediaCodec 是否支持音频编码器?
我正在尝试建立一个视频系统。我通过 Preview 从 Camera 获取数据,然后将数据提供给 Mediacodec 并让它完成视频编码工作。现在我专注于音频部分。我不确定将哪个 API 用于音频捕捉和音频编码。
我做了一些搜索。但似乎大多数演示都使用 MediaRecord。由于我已经用 MediaCodec 替换了 MediaRecord,我想我需要找到一些新的方法来完成音频部分。如何捕捉音频?MediaCodec 可以做音频编解码吗?
谢谢你!
android - Android mediacodec 实时解码 h264 流,延迟约 1 秒
我正在尝试通过 Galaxy S3 中的 WIFI 摄像头解码 h264 实时流,视频播放正常,但似乎 mediacode 低级别总是缓冲 1 秒的视频帧,新帧只能由新传入的 NAL 单元解码. 这会导致大约 1 秒的延迟。
当MediaCodec.createDecoderByType("video/avc");
被调用时,我可以从 logcat 中看到分配了 22 个缓冲区,
而且我可以看到大约需要将 16 个 NAL 单元推入解码器,然后才能输出任何帧。
我的问题是为什么这个视频缓冲?如果这是问题,我可以尝试分配更少的缓冲区。无论如何我可以减少这个视频缓冲吗?
android - 在 Android 中,如何将预定义的 Surface 传递给 MediaCodec 进行编码?
我有一个管理自己的 GLSurfaceView 的应用程序,现在我想使用 Android 4.3 的新 MediaCodec 功能,该功能将 Surface 作为输入。
在我见过的所有示例中,Surface 都是使用 MediaCodec.createInputSurface() 创建的,然后为此 Surface 创建 GL 上下文。这让人感觉很单一,而且很难将其改造成已经稳定的代码库。
是否可以改用 MediaCodec.configure(format, a_predefined_Surface, null, MediaCodec.CONFIGURE_FLAG_ENCODE) ?这允许我以即插即用和按需的方式使用 MediaCodec。MediaCodec.configure() 采用 Surface 参数的事实表明这应该是可能的。但是,API 声明“指定在其上呈现此解码器输出的表面” http://developer.android.com/reference/android/media/MediaCodec.html#configure(android.media.MediaFormat , android. view.Surface, android.media.MediaCrypto, int) 这是否意味着这仅用于解码而不是编码?. 如果是这样,有没有办法让 MediaCodec 使用预定义的 Surface 进行编码?
我传入的 Surface 已经创建,EGL_RECORDABLE_ANDROID 设置为 true,并且返回的 GL 上下文经过验证包含所需的 EGL_RECORDABLE_ANDROID 属性。尽管如此,MediaCodec.configure() 失败并出现无用异常“native_window_api_connect 返回错误:无效参数 (-22)”:
这是来自带有 Android 4.3 的三星 Galaxy S4。
android - 如何向 MediaMux 提供音频数据和视频数据
我正在尝试通过预览获取视频原始数据,通过 AudioRecord 获取音频原始数据。然后我会将它们发送到 MediaCodec(我将设置两个 Codec 实例)。之后,我会将视频数据和音频数据发送到MediaMux以获取 mp4 文件。我有两个问题:
1)我之前使用过MediaMux来处理视频数据。对于视频数据,MediaMux是逐帧处理的,但是视频记录是连续的。MediaMux 如何同步处理视频和音频。
2)我在函数writeSampleData中只找到了 inputbuffer 的变量。StackOverflow 上的一个好人也提供了MediaMux的演示。但是这个演示只有一个源数据变量。这个变量怎么能同时支持视频数据和音频数据呢?
谢谢!
android - 暂停/恢复媒体编解码器
我正在尝试为我的应用程序实现暂停/恢复功能,该功能使用 MediaCodec 记录显示捕获。我尝试在不调用 mEncoder.release() 的情况下执行 mEncoder.stop() 和 mEncoder.start() ,但这没有用。再次调用 mEncoder.start() 时出现 IllegalStateException。现在我实施了一种解决方法,在捕获完成后我正在合并视频的和平,但合并需要很长时间。任何人都可以帮助我吗?也许有人已经实现了这个东西?
初始化:
暂停:
取消暂停:
例外:
媒体格式:
android - 从 SurfaceComposerClient 获取屏幕截图
是否可以使用 SurfaceComposerClient 来获取屏幕截图,就像 MediaCodec 使用 createInputSurface() 一样。
我不能为此使用 MediaCodec,因为我需要原始视频而不是编码数据。
从 4.3 开始,ScreenshotClient 似乎不能做多个屏幕截图。
android - 无法混合音频和视频
我正在编写一个使用 MediaCodec 记录屏幕截图和音频的应用程序。我使用 MediaMuxer 来混合视频和音频以创建 mp4 文件。我成功地分别编写了视频和音频,但是当我尝试将它们混合在一起时,结果出乎意料。要么在没有视频的情况下播放音频,要么在音频之后立即播放视频。我的猜测是我在时间戳方面做错了,但我无法弄清楚到底是什么。我已经查看了这些示例:https ://github.com/OnlyInAmerica/HWEncoderExperiments/tree/audiotest/HWEncoderExperiments/src/main/java/net/openwatch/hwencoderexperiments和 bigflake.com 上的示例,但无法找到回答。
这是我的媒体格式配置:
音视频编码器、复用器:
我用它来设置视频时间戳:
这是设置音频时间戳:
我从这个例子https://github.com/OnlyInAmerica/HWEncoderExperiments/blob/audiotest/HWEncoderExperiments/src/main/java/net/openwatch/hwencoderexperiments/AudioEncodingTest.java来避免“timestampUs XXX < lastTimestampUs XXX”错误
有人可以帮我解决问题吗?
android - 媒体提取器的问题
我试图在特定时间获取特定帧作为电影中的图像,使用MediaExtractor
和MediaCodec
。如果满足以下条件,我可以成功:
- 但是,我使用
extractor.seekTo(time, MediaExtractor.SEEK_TO_PREVIOUS_SYNC);
,这只给出最近的同步帧而不是目标帧。 - 我使用 顺序提取所有帧
extractor.advance();
,但我需要获取目标帧而不是全部。
所以,我尝试以下方法:
这提供了正确的帧,但由于某种原因,图像已损坏。它看起来像正确的图像(我从成功案例中得到的图像),但有一些像素化和奇怪的雾度。
这while-loop
是成功案例和腐败案例之间唯一不同的地方。如何在不MediaExtractor
损坏图像的情况下提前到特定时间(不仅仅是同步时间)?