问题标签 [mediaextractor]

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.

0 投票
2 回答
2160 浏览

android - 与 wav 文件一起使用时,MediaExtractor 抛出 IllegalArgumentException

我正在使用这样的Android MediaExtractor:

inputBuffer 由配置为 AAC 编码器的 MediaCodec 提供。目标是将wave文件转换为aac。当然,上面的代码是缩写的,但我将错误跟踪到最后一行。

它也仅在使用带有 wav 文件的 MediaExtractor 时发生。例如,我改用 .m4a,一切正常。

MediaExtractor 的文档说:

MediaExtractor 有助于从数据源中提取解复用的(通常是编码的)媒体数据。

“通常编码”不排除未编码的 PCM 音频....对吗?任何人之前都尝试过或知道另一种稳定的(!)方法:

  • 从 wav 中提取音频样本(不包括 44 字节或 46 字节标头)?
  • 在Android上将wav文件转换为aac?

更新

这是日志猫:

我使用的是 API 16,所以 MediaMuxer 不是一个选项(在 API 18 中添加)。

0 投票
0 回答
174 浏览

android - android 6.0 中的 MediaExtractor API 限制

一般来说,我的代码基于ExtractMpegFramesTest示例。

在我的应用程序中,我只是录制视频,然后逐帧操作视频。我的应用程序适用于任何低于 6.0 的 Android 版本。

我对问题到底出在哪里有点困惑。

这是我的 logcat 的一部分:

代码太复杂了,所以如果有人知道问题出在哪里,请告诉我,我会添加具体代码。

0 投票
1 回答
1833 浏览

android - Android MediaCodec 后向搜索

我正在尝试使用MediaCodec和实现对视频的精确搜索MediaExtractor。通过关注 Grafika 的MoviePlayer,我已经成功实现了前向搜索。但是我仍然有向后搜索的问题。相关的代码在这里:

基本上和MoviePlayer的doExtract方法是一样的。我只是添加了一些修改以返回到前一个关键帧,而不是向前解码到我想要的位置。我也在这里遵循了fadden的建议,但收效甚微。

另一个问题,据我了解,ExoPlayer 是基于 构建的MediaCodec,那么为什么它可以很好地播放 iOS 录制的视频,而 MoviePlayer 的纯实现MediaCodec却不能呢?

0 投票
1 回答
429 浏览

android - 从一个 mp4 获取音频并在 android 的重新采样(较小)mp4 中使用它

我找到了一种解决方案,用于对使用设备上的相机拍摄的 .mp4 视频进行重新采样以使其更小(通过分辨率、比特率和帧率调整大小)。问题是,它不会携带音频。

我已经查看了几种不同的选项来尝试从我的源(大)mp4 中获取音频并将其推送到我较小的 mp4 中,但我似乎无法让这些程序中的任何一个正常工作。

我尝试了以下方法:1)使用以下方法从源中提取 PCM 音频:How do I extractor audio to mp3 from mp4 using java in Android? 2) 将 PCM 转换为 M4A,然后使用以下方法将 M4A 添加到较小的 MP4:https://github.com/tqnst/MP4ParserMergeAudioVideo/blob/master/Mp4ParserSample-master/src/jp/classmethod/sample/mp4parser/MainActivity。爪哇

这是我最接近的方法,但音频真的很慢,与较小的 mp4 中的视频完全不匹配。

我还尝试了从一个 mp4 到另一个“直接复制”的变体:Concatenate multiple mp4 audio files using android´s MediaMuxer

这使得我较小的 mp4 实际上比我的源 mp4 更大(文件大小),并且它实际上并没有移动声音。

MediaMuxer 的 android 文档非常糟糕,我无法确定我需要做什么才能使其正常工作。看起来这应该是一个非常微不足道的任务......

任何建议或意见,将不胜感激。

TIA

0 投票
0 回答
1742 浏览

java - 使用 MediaCodec、MediaExtractor、MediaMuxer 等在 android 中反转视频。

要求:我想反转视频文件并将其保存为android中的新视频文件。IE。最终输出文件应反向播放视频。

我尝试了什么:我使用了以下代码(我从 AOSP https://android.googlesource.com/platform/cts/+/kitkat-release/tests/tests/media/src/android/media/cts获得的/MediaMuxerTest.java)稍作修改。

我所做的主要改变是在这一行

这样做是为了将视频帧以相反的顺序写入输出文件。但结果与原始视频相同(未反转)。

我觉得我在这里尝试的没有任何意义。基本上我对视频格式、编解码器、字节缓冲区等不太了解。

我也尝试过使用 JavaCV,它是对 opencv、ffmpeg 等的一个很好的 java 包装器,我让它与那个库一起工作。但是编码过程需要很长时间,而且由于库的原因,apk 的大小也变得很大。

使用 android 内置的 MediaCodec API,我希望事情变得更快更轻量级。但如果他们提供相同的解决方案,我也可以接受其他解决方案。

如果有人可以提供有关如何在 android 中完成此操作的任何帮助,我们将不胜感激。此外,如果您有很棒的文章可以帮助我了解有关视频、编解码器、视频处理等的细节/基础知识,那也会有所帮助。

0 投票
1 回答
572 浏览

android - Android MediaCodec 可以同时解码到两个 Surface 吗?

我正在尝试改进我们应用程序的帧提取。基本上我所做的是将 Grafika 的MoviePlayer前向搜索解决方案和 BigFlake 的解决方案结合起来ExtractMpegFramesTest提取帧。对于提取,我回溯到前一个关键帧,然后向前解码,只保存最后一帧。像这样的东西(有关更完整的解释,请参阅我之前的问题):

问题有时是从extractor.getSampleTime()向后搜索然后向前解码时检索的样本时间似乎与直接向前搜索的时间不匹配。

我已经包含了一个日志以使这一点更清楚:

如您所见,在前向搜索中extractor.getSampleTime()可以到达位置12137125,而后向搜索然后向前解码,它只能到达12128783。我不确定它为什么会发生,但这会导致表示帧和提取帧之间不匹配。EGLSurface这种方法也不是很有效,因为每次我需要提取帧时我都必须设置一个并解码它。根据所需帧与前一个关键帧的距离,此操作可能需要 3 到 5 秒,对于多次提取来说肯定太长了。

我想问一下是否有可能使解码器同时解码到两个表面(一个SurfaceView用于显示和一个EGLSurface用于帧检索),以便我可以潜在地解决这些准确性和性能问题。

我之前也尝试过使用 FFmpeg 检索帧,性能大致相同。如果有比使用 OpenGL 更好的检索帧的方法,我非常愿意尝试。

编辑:经过进一步测试,我可以匹配这extractor.getSampleTime()两种方法,即使检索到的帧有时可能与显示帧不匹配。

编辑2:关于显示帧和提取帧之间的不匹配,它实际上非常简单,但如果你不知道它是如何MediaCodec工作的,一开始会很混乱。我必须重新阅读每一个 fadden 的评论以更好地理解这个问题(是给我那个“啊哈”时刻的那个)。

简而言之,解码器喜欢在吐出任何表示缓冲区之前消耗多个缓冲区。所以当前显示的那个和当前位置的那个是不一样的extractor.getSampleTime()。所以显示和提取之间要同步的正确值应该是输出缓冲区的presentationTime,如下所示:

mCurrentSampleTime = mBufferInfo.presentationTimeUs;

理解这一点有助于解决许多神秘的问题(例如为什么第一帧不在 0 位置?)。希望这会对某人有所帮助。

0 投票
1 回答
317 浏览

android - MediaExtractor - readSampleData() 的第一个结果是 -1

我正在尝试使用 Android 从视频文件中提取帧MediaExtractor,但由于某种原因,第一个结果readSampleData()是 -1。我究竟做错了什么?

文件本身当然是可播放的。

编辑 2:这是存在此问题的 MediaExtractor 源代码的链接

0 投票
0 回答
46 浏览

android - ExtractMpegFramesTest 示例在 API23 设备上不起作用

我试图在一些 android 设备上运行这个 bigflake 示例。

我在 Galaxy S3、S4 和 S7 上试过。

对于 Galaxy S3,一切正常。我已经拍摄了第一帧,这就是我所拥有的: 在此处输入图像描述

然后我尝试在 Galaxy S6 和 S7 上运行相同的代码,但随后我收到了相同视频的奇怪图像在此处输入图像描述

有人(fadden lol)知道什么可能导致这个问题吗?

0 投票
0 回答
610 浏览

android - MediaCodec/MediaExtractor - 尝试从第二个 MediaExtractor 到第二个解码器的 queueInputBuffer 时出现 libexynosv4l2 错误

在我尝试使用 MediaCodec 连接视频的过程中,我尝试使用两个MediaExtractors,每个都与 s 配对MediaCodec作为解码器。我尝试本地化提取器和解码器循环,使它们看起来像这样:

我在通常的 ExtractDecodeEditEncodeTest 中使用这些函数分别代替了 Extractor 代码和 Decoder 代码。我只是传入我想要使用MediaExtractor的解码器,我希望该函数使用所述提取器和解码器执行通常的提取/解码循环。MediaCodec

当我将这些函数用于第一个提取器-解码器对时,它们运行良好。但是,当我在第一个工作完成后立即将它们用于第二个提取器-解码器对时,我从该行中得到以下异常destinationDecoder.queueInputBuffer(decoderInputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);

W/System.err: android.media.MediaCodec$CodecException: Error 0xfffffff3

编辑:

我仔细查看了堆栈跟踪,发现了这些:

我需要在解码器设置中更改什么?

0 投票
1 回答
971 浏览

android - 如何处理 Android MediaCodec 解码器的第一个输出 ByteBuffers?

我正在尝试使用 Android 的 MediaCodec 套件编写音频重采样器。

我目前正在将 MP3 立体声音频文件输入 MediaExtractor,然后由 MediaCodec 解码。源音频的采样率为 48000。

我不明白的是我从解码器收到的前四个输出缓冲区:

  1. 尺寸 0,时间 0
  2. 大小 0,时间 24000
  3. 尺寸 4312,时间 48000
  4. 尺寸 4608,时间 72000
  5. 尺寸 4608,时间 96000
  6. 等等

这个答案这个答案这篇文章,我相信前两个缓冲区只是传播“编码器延迟”,可能会被丢弃。但是,我列出的第三个缓冲区让我陷入了循环。

对于缓冲区 #4(及以后),数学计算如下:

缓冲区 #3 发生了什么?对数据的直接理解表明,音频在 48000 us 时间开始播放,然后在 72000 us 标记之前暂停,此时它开始连续播放,没有中断。

似乎更有可能在缓冲区#3 的数据之前有 296 个隐藏的 0,但是我的代码中的任何变量似乎都没有指示这个偏移量。任何人都可以为我阐明这一点吗?