问题标签 [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 回答
2098 浏览

java - Android 使用 MediaCodec 解码 mp3。不使用 MediaExtractor

我想使用 MediaCodec 解码 mp3。但是,我不想使用 MediaExtractor。因为这是因为我想从 mp3 中获取元数据。冰冷(Shoutcast)流也被考虑在内。

我尝试通过改进MediaExtractor的示例编写代码来解码 FileInputStream 中的 mp3 文件。但是解码导致错误是不可能的。

执行过程中出错...

0 投票
1 回答
1906 浏览

android - MediaExtractor 如何解析 H264 NAL 单元?

我试图了解 Android MediaExtractor 如何解析 H264(包含在容器格式中)。

如果我检查 H264 流,我发现它由由序列 00 00 00 01 划分的 NAL 单元组成。

MediaExtractor 返回的样本正是那些 NAL 单元,每个都以该标记开头——除了对于特定数据源,前三个 NAL 单元是连接的。前两个 NAL 单元非常短(29 和 8 字节)。

为什么会发生这种串联?如果我要手动解析 H264,我怎么知道要进行这种连接?

对于前三个 NAL 单元,起始码前缀后面的字节是十进制的 103、104 和 101。对于以下大多数 NAL 单元,它是 65,偶尔是 101。

0 投票
1 回答
953 浏览

android - MediaExtractor 如何确定在 H264 NAL 单元中放入什么?

我在两台 Android 设备上检查了 MediaExtractor 的输出,在给定相同的视频文件的情况下,它似乎在它们上产生了稍微不同的样本。

使用一个设备,非 VCL NAL 单元连接到下一个 VCL 单元以生成样本。在另一台设备上,每个非 VCL 单元构成一个完整的样本。

另一个区别:在一个设备上,样本在样本中具有前导 0 字节和起始码前缀 (001);另一方面,这些字节被省略。

如果我尝试将 NAL 单元的格式用于另一台设备上的第一个设备,则视频无法播放。

如果我正在制作自己的 NAL 单元(不使用 MediaExtractor),是否有一种原则方法可以知道 MediaCodec H264 解码器期望什么格式?

0 投票
2 回答
678 浏览

android - 给定一个视频 URL,我如何将视频片段保存到 Android 手机上?

给定一个视频网址(例如:www.example.com/video.mp4),我如何以编程方式在 Android 中保存视频的短片(例如:5 秒,00:00:10 - 00:00:15)应用到手机上?

目前,这就是我所拥有的 - 但这会将整个视频从 url 保存到设备。看来我需要使用 MediaExtractor 和 MediaMuxer。

0 投票
1 回答
1703 浏览

android - 音频编解码器 dequeueInputBuffer 在设备上返回 -1

我正在尝试播放一些从 MPEG2 传输 (.ts) 文件中获取的音频。我通过 MediaExtractor 获取音频流,使用 readSampleData 将样本复制到 MediaCodec 输入缓冲区,然后将 MediaCodec 输出缓冲区写入 AudioTrack。MediaExtractor 将音频 MIME 类型指示为“audio/mp4a-latm”。

所有这些都在 Nexus 7 2013 平板电脑上完美运行。

但它在廉价的 Neutab x7 平板电脑上根本不起作用。问题是在几个样本之后,dequeueInputBuffer 反复返回 -1。注释掉对 AudioTrack.write() 的调用并不会改变这一事实,因此问题在于 MediaCodec 的操作。

代码看起来像(记录,省略了一些错误处理):

使用audioCodec从 获取的 MediaFormat 进行配置audioExtractor。我尝试将 TIMEOUT 增加到较大的值,但没有任何乐趣。

为什么这段代码在这两种设备上的行为会有所不同?有什么旋钮可以转动吗?

Neutab 上有一个“视频”应用程序可以很好地播放这个文件。Logcat 显示它也在使用 MediaExtractor 和 AudioTrack,但显然不是 MediaCodec。我在 logcat 中看到 Omx* 条目,所以它可能直接使用 libstagefright。

0 投票
2 回答
808 浏览

android - 如何根据Android中视频的播放时间偏移量获取字节偏移量?

如何根据视频的播放时间偏移量获取视频的字节偏移量?例如,给定视频的播放时间偏移量为 15 秒,我想知道那一秒的字节偏移量。

这样做的原因是因为我希望能够从视频中“修剪”剪辑。我希望能够保存从 00:00:20 到 00:00:35 的视频剪辑。

目前,这就是我所拥有的 - 但这会将整个视频从 url 保存到设备:

0 投票
1 回答
345 浏览

android - ExtractMpegFramesTest 在 android 中以纵向模式录制的视频存在问题

我正在关注ExtractMpegFramesTest帖子以从视频中提取 PNG 帧。这适用于以横向模式录制的视频,但不适用于以纵向模式录制的视频。

有人知道如何使用上面链接中提供的解决方案从肖像视频中生成 PNG 帧吗?

我已经用 720p 和 1080p 视频对此进行了测试。

我观察到的几件事是,

MediaExtractor 提供 720p 视频的宽度和高度 1280 和 720,无论方向如何。这应该是横向 1280 x 720 和纵向 720 x 1280。1080p 视频中的类似情况。

另一件事是当我在方法 drawFrame in invert 参数中传递 false 时,PNG 帧很好,但颠倒了。

编辑:

使用 ExtractMpegFramesTest 我得到了这个结果

具有反转参数 true 的横向视频提供完美的图像 http://postimg.org/image/qdliypuj5/

反转参数为 true 的人像视频会产生失真的图像 http://postimg.org/image/vfb7dwvdx/

具有反转参数 false 的肖像视频提供了完美的倒置图像。(根据@Peter Tran 的回答输出可以通过旋转位图来修复。) http://postimg.org/image/p7km4iimf/

0 投票
1 回答
2100 浏览

java - 使用 MediaExtractor 和 MediaCodec 在视频播放中跳过帧

我正在使用 MediaExtractor/MediaCodec 解码视频并将其渲染到 TextureView。作为模板,我使用了以下代码:https ://github.com/vecio/MediaCodecDemo/blob/master/src/io/vec/demo/mediacodec/DecodeActivity.java

我希望能够以 2 倍的速度播放视频。幸运的是,媒体编码/解码速度足够快,因此我可以通过让 MediaCodec 解码每一帧来完成此操作,然后仅将每隔一帧渲染到屏幕上。但是,这感觉不是一个很好的解决方案,特别是如果您想将播放增加任意值。例如,在 10 倍速度下,编解码器无法以足够快的速度解码帧,以 30 fps 的速度每 10 帧播放一次。

因此,我希望通过多次调用 MediaExtractor.advance() 来跳过不需要解码的帧来控制播放。例如:

使用此代码,理论上提取器应该只提取每第 n帧,其中n由变量“playbackSpeedIncrease”定义。例如,如果n = 5,这应该超过第 1-4 帧,并且只提取第 5 帧。

然而,这在实践中是行不通的。当我运行此代码时,渲染到屏幕上的图像会失真:在此处输入图像描述

有人知道为什么吗?有关以任意速度增加播放视频的更好方法的任何建议?

0 投票
0 回答
1217 浏览

java - Android MediaExtractor seek() 精度与 MP3 音频文件

我无法在使用 Android 的 seek() 上获得合理的准确性MediaExtractor。对于某些文件,例如这个文件,我发现有很大的不准确之处(在这种情况下大约为 3 秒。)我有以下流程:

  1. 打电话setDataSource()selectTrack()
  2. 称呼seekTo()
  3. 称呼play()

在这种情况下,它会寻找不正确的位置,但会报告正确的位置。如果我然后寻求另一个位置,它会继续以相同的幅度偏离。但是,如果我寻求 0,它会自行更正,然后将寻求文件中的正确位置。

这仅仅是 MediaExtractor 中的限制/错误吗?有没有人有修复/解决方法来获得更高的准确性?我不希望在搜索之前从位置 0 开始播放,但我想这是一种选择。

其他一些注意事项:

  • Android MediaPlayer 显示相同的行为。
  • 无论我选择MediaExtractor.SEEK_TO_PREVIOUS_SYNC还是SEEK_TO_CLOSEST_SYNC
  • 我在 KitKat 和 Lollipop、模拟器和物理设备上看到了同样的问题。
  • 对一个失败文件的快速分析显示“Xing 标头中指定的 MPEG 数据字节数错误”,但对于播放正常的文件,我得到了相同的结果。
0 投票
0 回答
792 浏览

android - 使用 MediaExtractor 提取视频的特定部分

我正在尝试使用预先录制的视频文件的一部分在 Android 上进行处理。目前我正在使用 Android 上的 MediaCodec 库。我正在使用 MediaExtractor 从视频文件中提取数据。这个想法是只提取所需的 gata 流进行处理。代码如下所示:

Logcat 是:

java.io.IOException:无法实例化提取器。在 android.media.MediaExtractor.setDataSource(本机方法)。

如果我将起始字节设置为 0,效果很好。我做错了什么?我们不能使用 mediaextractor 提取视频的一部分吗?