问题标签 [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.
java - Android 使用 MediaCodec 解码 mp3。不使用 MediaExtractor
我想使用 MediaCodec 解码 mp3。但是,我不想使用 MediaExtractor。因为这是因为我想从 mp3 中获取元数据。冰冷(Shoutcast)流也被考虑在内。
我尝试通过改进MediaExtractor的示例编写代码来解码 FileInputStream 中的 mp3 文件。但是解码导致错误是不可能的。
执行过程中出错...
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。
android - MediaExtractor 如何确定在 H264 NAL 单元中放入什么?
我在两台 Android 设备上检查了 MediaExtractor 的输出,在给定相同的视频文件的情况下,它似乎在它们上产生了稍微不同的样本。
使用一个设备,非 VCL NAL 单元连接到下一个 VCL 单元以生成样本。在另一台设备上,每个非 VCL 单元构成一个完整的样本。
另一个区别:在一个设备上,样本在样本中具有前导 0 字节和起始码前缀 (001);另一方面,这些字节被省略。
如果我尝试将 NAL 单元的格式用于另一台设备上的第一个设备,则视频无法播放。
如果我正在制作自己的 NAL 单元(不使用 MediaExtractor),是否有一种原则方法可以知道 MediaCodec H264 解码器期望什么格式?
android - 给定一个视频 URL,我如何将视频片段保存到 Android 手机上?
给定一个视频网址(例如:www.example.com/video.mp4),我如何以编程方式在 Android 中保存视频的短片(例如:5 秒,00:00:10 - 00:00:15)应用到手机上?
目前,这就是我所拥有的 - 但这会将整个视频从 url 保存到设备。看来我需要使用 MediaExtractor 和 MediaMuxer。
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。
android - 如何根据Android中视频的播放时间偏移量获取字节偏移量?
如何根据视频的播放时间偏移量获取视频的字节偏移量?例如,给定视频的播放时间偏移量为 15 秒,我想知道那一秒的字节偏移量。
这样做的原因是因为我希望能够从视频中“修剪”剪辑。我希望能够保存从 00:00:20 到 00:00:35 的视频剪辑。
目前,这就是我所拥有的 - 但这会将整个视频从 url 保存到设备:
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/
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 帧。
然而,这在实践中是行不通的。当我运行此代码时,渲染到屏幕上的图像会失真:
有人知道为什么吗?有关以任意速度增加播放视频的更好方法的任何建议?
java - Android MediaExtractor seek() 精度与 MP3 音频文件
我无法在使用 Android 的 seek() 上获得合理的准确性MediaExtractor
。对于某些文件,例如这个文件,我发现有很大的不准确之处(在这种情况下大约为 3 秒。)我有以下流程:
- 打电话
setDataSource()
和selectTrack()
- 称呼
seekTo()
- 称呼
play()
在这种情况下,它会寻找不正确的位置,但会报告正确的位置。如果我然后寻求另一个位置,它会继续以相同的幅度偏离。但是,如果我寻求 0,它会自行更正,然后将寻求文件中的正确位置。
这仅仅是 MediaExtractor 中的限制/错误吗?有没有人有修复/解决方法来获得更高的准确性?我不希望在搜索之前从位置 0 开始播放,但我想这是一种选择。
其他一些注意事项:
- Android MediaPlayer 显示相同的行为。
- 无论我选择
MediaExtractor.SEEK_TO_PREVIOUS_SYNC
还是SEEK_TO_CLOSEST_SYNC
- 我在 KitKat 和 Lollipop、模拟器和物理设备上看到了同样的问题。
- 对一个失败文件的快速分析显示“Xing 标头中指定的 MPEG 数据字节数错误”,但对于播放正常的文件,我得到了相同的结果。
android - 使用 MediaExtractor 提取视频的特定部分
我正在尝试使用预先录制的视频文件的一部分在 Android 上进行处理。目前我正在使用 Android 上的 MediaCodec 库。我正在使用 MediaExtractor 从视频文件中提取数据。这个想法是只提取所需的 gata 流进行处理。代码如下所示:
Logcat 是:
java.io.IOException:无法实例化提取器。在 android.media.MediaExtractor.setDataSource(本机方法)。
如果我将起始字节设置为 0,效果很好。我做错了什么?我们不能使用 mediaextractor 提取视频的一部分吗?