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

android - Android 9 AAC 解码器输出带有 ffmpeg 编码文件的零样本

我有一些自动化测试尝试使用 AndroidMediaDecoderMediaExtractor. 这些文件是使用各种编码器生成的:fdk-aac、ffmpeg(使用 fdk 或默认的 aac 编码器)、iOS。

在 Android 9 上,使用 创建的剪辑的测试失败ffmpeg,这会导致 PCM 文件为空。在旧版本的 Android 上,相同的剪辑可以很好地解码。

我仔细检查了我的代码,解码过程按预期进行:

  • 我使用提取压缩数据MediaExtractor
  • 将其排入编解码器
  • 从编解码器中取出输出缓冲区。

问题是,当最后一个可用的输入缓冲区入队并且输出缓冲区MediaCodec.BUFFER_FLAG_END_OF_STREAM出队时,所有输出缓冲区都是空的!

然后我注意到MediaFormat从音频文件中提取的信息MediaExtractor.getTrackFormat(int track)包含一个未记录的"encoder-delay"密钥。

对于 android 8 及更低版本,该密钥仅存在于使用iTunSMPB标签信息编码的 m4a 剪辑中。这是我为测试文件获得的值的摘要:

相反,在 Android 9上,我得到以下结果:

看起来有些东西发生了变化,MediaExtractor现在能够检索所有被测文件的编码器延迟。这在理论上很好,因为没有"encoder-delay"信息的文件确实显示解码的 PCM 数据有延迟(这是一个已知问题)。

但是......虽然“fdkaac with ISO delay info”的值是正确的,并且导致一个没有初始填充的有效 PCM 文件(终于!),但 ffmpeg 生成的文件的值看起来很大并且可能是错误的!

我知道真正的编码器延迟值对于 ffmpeg 情况是 1024,对于ffmpeg (fdk)情况是 2048 ,我认为提取格式中 key 的高值是文件为空的原因。

事实上,如果我在将"encoder-delay"密钥传递给之前尝试将格式中的密钥设置为 0,MediaCodec.configure(...)我会得到具有预期延迟的正确未压缩数据。

我在这一点上的猜测是MediaExtractor编码器延迟值检索有一些错误,但也许我忽略了一些东西。

由于 ffmpeg 非常流行,我的许多应用程序用户很可能会尝试导入使用它生成的文件,而此时我看不到一个万无一失的解决方案。

有人有建议/解决方法吗?

0 投票
0 回答
236 浏览

android - 使用媒体提取器修剪视频

我有一个视频,我需要使用 MediaExtractor.seekTo 对其进行修剪,然后从提供的时间开始阅读,但它在大多数情况下都不起作用这是实现的片段

我试图解决这个问题,我试图从视频中读取样本并检查它的呈现时间并检查它与开始时间的对比,还检查这个样本是否是一个关键帧,从这里开始编写这个实现的一个片段,

预期结果是从提供的时间开始,但实际是从 0 时间开始,忽略提供的时间

0 投票
0 回答
1407 浏览

android - 如何在 Android 中将 AAC 格式(mp4 音频文件)解码为 PCM 格式

我有一个 mp4 文件,其中只有一个 AAC 格式的音轨。我想将此 mp4 文件转换为 PCM 格式的音频文件。我可以成功地从 mp4 文件中提取 AAC 格式的音频文件。但我无法将 AAC 格式解码为 PCM 格式。

以下代码可以正常工作,并将 PCM 数据保存到文件中。但是这个PCM格式的音频不能用任何媒体播放器打开。它说文件已损坏。我尝试使用ffmpeg将AAC格式解码为PCM格式,ffmpeg没有问题。但是由于库的大小,我不想使用 ffmpeg 库。

首先,我尝试将 mp4 文件路径提供给 inputfilePath,并成功创建并保存了输出文件。但是这个输出文件没有在任何媒体播放器中打开。

extractAudioFromVideo(".../input.mp4", ".../output.wav");

其次,我成功地从 mp4 文件中提取了 AAC 音频文件。我试图将 ACC 文件路径提供给 inputfilePath,但输出中没有任何变化。

extractAudioFromVideo(".../input.aac", ".../output.wav");

静态无效 extractAudioFromVideo(@NonNull 字符串输入文件路径,@NonNull 字符串输出文件路径){

我应该做的不仅仅是这行代码以将其保存为 PCM 格式还是我做错了什么?

0 投票
1 回答
189 浏览

java - 为什么 MediaExtractor 在 Android O 上为 getTrackCount() 返回 0?

我正在尝试在 Android Oreo 中创建自定义视频播放器。从 L 迁移后,提取器在获取 trackCount 时返回 0。当文件插入到资产中时,它正在工作。打开提取器没有错误,只有日志显示没有找到轨道。

我添加了从代码和 xml 中写入和读取存储的所有权限。

0 投票
1 回答
86 浏览

java - Android 中 AudioPresentation 类有什么用?

最近我发现这个 MediaExtractor类有一个方法叫做getAudioPresentations 这个方法是干什么用的?

AudioPresentation 类封装了描述下一代音频内容中可用的音频演示的信息。

我无法理解这个定义。有人可以帮我吗

0 投票
2 回答
724 浏览

android - Android Q 上的 AMediaExtractor setDataSource AMEDIA_ERROR_UNSUPPORTED 错误

我正在使用AMediaCodecand AMediaExtractor,在所有设备上都可以正常工作(我希望:),但是如果我在 Android Q(在我的情况下为 Pixel 2XL)上检查相同的代码,我会收到这样的错误AMEDIA_ERROR_UNSUPPORTED

我所做的

也许这与Android Q中引入的隐私有关,但我没有找到任何有关它的信息......

如何检查这个问题?

0 投票
1 回答
683 浏览

java - Android - 将 MediaMuxer 与 MediaExtractor 和 PCM 流一起使用会导致视频帧损坏

我正在为一个支持流媒体和录制视频的应用程序编写一个类。简而言之,当手机在流媒体和录制时,音频保存在 PCM 文件中,视频保存在 mp4 文件中,使用 MediaRecorder。我的目标是,当录制完成时,使用 MediaMuxer 并将两个输入组合成一个新的组合 .mp4 文件。

我尝试使用 MediaMuxer 对音频进行编码并使用 MediaExtractor 提取视频。原始视频和音频文件都完好无损,输出文件包含正确的音频,但视频似乎已损坏,就好像跳帧一样。

这是我目前正在使用的代码:

0 投票
0 回答
51 浏览

android-mediacodec - 是否可以使用 MediaExtractor 读取 VES(视频基本流)?

我有一个以 h264 格式编码为 ves 文件的文件。

如果我尝试将此文件路径传递给MediaExtractor

我收到这样的错误

因此,据我了解,问题是当您使用 ves 文件时,您没有包含重要数据的容器(一些标题......)

所以,我正在寻找方法(一些设置选项)如何setDataSource()和不出错......

随意问

0 投票
1 回答
235 浏览

android-ndk - 将 AMediaExtractor 与位于媒体存储中的音频文件一起使用时,设置提取器数据源时出错,错误 -10002

我正在尝试MediaStore在 Android 10 上从中获取音频文件,从中提取音频数据,对其进行解码并播放它。

调用实例时出现以下错误setDataSourceMediaExtractor

重现:

MainActivity中,我将路径传递给本机端,第二次传递 URI,每次都没有运气。

从日志:

我的清单:

安装应用程序后,我还通过设置授予权限。

编辑:

带有测试代码的公共存储库:https ://github.com/AndrewBloom/MediaStoreToNativeAudioSample

相同的行为结果使用:

0 投票
1 回答
614 浏览

java - 在 Android 上合并/复用多个 mp4 视频文件

我在设备上保存了一系列 mp4 文件,这些文件需要合并在一起以制作一个 mp4 文件。

video_p1.mp4 video_p2.mp4 video_p3.mp4 > video.mp4

我研究过的解决方案(例如 mp4parser 框架)使用了已弃用的代码。

我能找到的最佳解决方案是使用 MediaMuxer 和 MediaExtractor。

代码运行,但我的视频没有合并(仅显示 video_p1.mp4 中的内容,并且它是横向的,而不是纵向的)。

谁能帮我解决这个问题?