问题标签 [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 投票
0 回答
152 浏览

java - 当我将 ParcelFileDescriptor 放入我的 MediaExtractor setDataSource() 时,导致 IOException

我从 DatagramSocket 获取视频数据,我们知道它是一个字节 [],我无法准确解码这个字节 []。所以我必须使用 MediaExtractor 来完成这项工作。这是我的代码:

当代码运行在 mExtractor.setDataSource(fd, 0, packet.getData().length); 异常是 java.io.IOException: Failed to instantiate extractor。我真的不知道如何解决这个问题....顺便说一句。昨天早上工作,但从昨天下午开始,它不再工作......请帮忙,非常感谢:)

0 投票
0 回答
396 浏览

android - 是否可以使用字节缓冲区作为 NDK AMediaExtractor 的数据源?

API有原生扩展。 但与 JAVA MediaExtractor 相反,只有两个功能需要设置:MediaExtractor
DataSource

我需要从字节缓冲区而不是文件中读取数据。所以我不能同时使用这两个函数来设置DataSource。因为,据我了解,FileDescriptor(fd) - 有点链接到磁盘上的实物资产。

请指教

0 投票
0 回答
201 浏览

android - 在 Android 上处理 h.264 基本流

我一直试图了解如何在 Android 上解码 h.264 基本流,但我一直无法找到任何明确的答案。此页面上的示例都很好,但它们正在生成帧以使用 MediaCodec 或 MediaExtractor 动态解码。

我正在寻找一种解决方案,使我能够解码基本流(即来自 *.264 文件或通过流式套接字)。我了解 NAL 单元的基本原理并将它们分开,但我不确定我是否了解如何将 NAL 单元输入解码器/提取器。

0 投票
1 回答
867 浏览

android - MediaExtractor.advance() - 流结束信号早于预期

advance()我的问题是通过类的方法早于预期(文件结束之前)发出的流结束信号MediaExtractor。根据 Google 参考, Advance ()方法在使用本地文件时可能会出错(这是我的情况 -filePath指向本地文件):

提取本地文件时,Advance() 和 readSampleData(ByteBuffer, int) 的行为在并发写入同一本地文件时未定义:

不幸的是,没有关于使用MediaExtractor没有advance()方法的词。如何移动到下一个样本?如果没有办法做到这一点,那么我想知道如何在inputBuffer不使用MediaExtractor.

我的代码片段如下:

0 投票
2 回答
1433 浏览

android - MediaCodec outputBuffer 始终为空

我的回调方法outputBuffer内部有问题。onOutputBufferAvailable()每次调用此回调方法时,我都会检查outputBufferusingoutputBuffer.hasRemaining方法,这始终是 return false

0 投票
0 回答
540 浏览

android - Android:如何从使用 MediaExtractor 下载的音频文件中提取音频样本

我正在制作一个非常简单的音乐应用程序,我试图弄清楚如何做到这一点:

  • 下载音频文件并在本地录制文件
  • 随时从文件中提取音频帧(在下载期间或之后)

1)对于下载部分,我按照这个例子使用改造。简而言之,它允许我下载文件,并在下载时将其记录在本地(因此我不必等待下载结束即可访问文件的数据)。

2)对于帧提取部分,我使用MediaExtractorMediaCodec喜欢这样:

它能做什么:

onAudioFileReady()被调用时,此代码提取并播放文件的音频样本,但仅播放已下载的音频样本。当它到达已下载部分的末尾时,MediaExtractor停止(看起来extractor.advance()不想继续提取......),即使有更多可用数据......

我想要达到的目标:

我希望能够继续提取文件的音频样本,当然只要有足够的数据。

重要的:

那时,您可能会问为什么我不只使用extractor.setDataSource(url). 以下是原因:

  • 我想将音频文件保存在本地,以便稍后播放
  • 我希望能够播放这首歌,即使在下载开始很久之后

有谁知道如何实现这一目标?在此先感谢您的帮助。

0 投票
1 回答
1007 浏览

android - 用于音频的 MediaExtractor,得到意外的音频

使用 MediaExtractor 类,我可以从保存的 mp4 视频中获取编码的音频样本数据,如下所示:

我有一个来自 GlSurface 的视频源,然后想使用 MediaMuxer 将此视频与前面提到的音频提取进行多路复用。在处理视频时,使用 hashmap 将音频交错到复用器中。我成功地混合了视频和音频并创建了可播放的 mp4 视频,但是音频听起来不像原始 mp4 的原始音频。

当我写入复用器时,我确实看到了预期的 bufferinfo.size 和 bufferInfo.presentationTimeUs:

我尝试使用标准 inputBuffer、outputBuffer 和 MediaCodec,例如https://gist.github.com/ams/1991ab18fbcb0fcc2cf9,但这会产生相同的音频,据我了解,MediaExtractor 应该已经编码音频数据,因此数据应该能够直接通过管道传输。

同样有趣的是,当我在最初提取时检查标志时:

以上内容均未针对原始 mp4 视频打印。我现在质疑原始 mp4 视频,以及是否有可能为 mp4 提供不可提取的音轨,以及我如何才能确认这一点。

我相信我已经看过了关于 stackoverflow 的大多数 MediaExtractor 问题以及 github 上的很多 MediaExtractor 单例解决方案。有谁知道以另一种方式提取音频的方法,即使用 ExoPlayer(最好不是 ffmpeg,因为它在 android 项目上增加了大量开销)。如果我当前的实施中有任何错误,任何见解都会有所帮助!

编辑 1:这是 audioExtractor.getTrackFormat(trackIndex) 的格式:

{max-bitrate=512000, sample-rate=48000, track-id=2, durationUs=22373187, mime=audio/mp4a-latm, profile=2, channel-count=4, language=```, aac-profile =2,比特率=512000,最大输入大小=1764,csd-0=java.nio.HeapByteBuffer[pos=0 lim=2 cap=2]}

0 投票
0 回答
441 浏览

android - Android MediaExtractor / MediaCodec 原生崩溃

我在 Android 中开发了一个简单的音频播放器,其中包括播放 .mp3 文件。要解码我使用 Android MediaExtractor 和 Android MediaCodec 的文件。示例代码如下所示:

在我所有的测试设备上,代码运行没有任何问题。然而,在 Google Play 上发布该应用程序后,我发现一些用户在通话过程中遇到了原生崩溃

从谷歌游戏控制台我并没有真正得到很多信息,但似乎它是在(本机)memcpy 操作期间发生的 SIGSEGV 错误(SEGV_MAPERR),其中数据存储在 ByteBuffer 中。我强烈假设这些用户在他们的设备上根本没有足够的内存。然而,似乎崩溃并不取决于可用的总内存。该应用程序可能会在具有 4GB RAM 的设备上崩溃,但在只有 2GB RAM 的设备上运行流畅。

似乎这主要发生在播放网络广播流时。

你们中有人知道如何解决这个问题吗?在运行 readSampleData() 之前检查 ByteBuffer 的容量是否足够?或者有没有办法捕捉到这个错误?对我来说最重要的是确保应用程序不再崩溃。任何帮助是极大的赞赏!

0 投票
0 回答
1014 浏览

android - 将 MP3 转换为 PCM 并在 Android 中播放

我正在尝试将 mp3 文件转换为 pcm 文件并尝试播放它。我希望值为 int16。我能够在 android 中使用 MediaCodec 和 MediaExtractor 成功转换它。而且我能够正常播放它(我必须更改采样率才能播放 PCM),而我将它直接写为字节数组,如下所示:

但正如我所说,我希望它为 Int16 (我的印象是这可以转换为 int 并保存。如果我错了,请纠正我)当我像这样将它保存为 int 时

它充满了噪音。我需要它作为 int 以便我可以对音频文件进行一些操作。如果你想查看整个项目,它在github

我想知道如何正确地将 pcm 文件写入 int 值并在 android 中播放。提前致谢

0 投票
1 回答
139 浏览

android - 使用 MediaExtractor 向后播放音乐

我想创建一个向后播放音乐的应用程序,该应用程序使用 Android MediaExtractor 解码音频并向后连接

由于我无法让 MediaExtractor 将其向后移动,我尝试将其从末端剪切到某个字节大小,翻转它,播放它,然后剪切下一个末端并播放等等。

为了做到这一点,我们需要使用MediaExtractor.seekTo快退,但是快退的位置是不明确的。我试图seekTo用采样率和一定的字节大小来计算微秒,但是当使用MediaExtractor.SEEK_TO_CLOSEST_SYNC标志时,连接部分会稍微偏移并出现噪音。

seekTo所以我认为如果我能知道正在同步的字节的位置,或者如果我能以字节为单位,这个问题就可以解决。

任何帮助,将不胜感激。