问题标签 [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.
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 中添加)。
android - android 6.0 中的 MediaExtractor API 限制
一般来说,我的代码基于ExtractMpegFramesTest示例。
在我的应用程序中,我只是录制视频,然后逐帧操作视频。我的应用程序适用于任何低于 6.0 的 Android 版本。
我对问题到底出在哪里有点困惑。
这是我的 logcat 的一部分:
代码太复杂了,所以如果有人知道问题出在哪里,请告诉我,我会添加具体代码。
android - Android MediaCodec 后向搜索
我正在尝试使用MediaCodec
和实现对视频的精确搜索MediaExtractor
。通过关注 Grafika 的MoviePlayer,我已经成功实现了前向搜索。但是我仍然有向后搜索的问题。相关的代码在这里:
基本上和MoviePlayer的doExtract
方法是一样的。我只是添加了一些修改以返回到前一个关键帧,而不是向前解码到我想要的位置。我也在这里遵循了fadden的建议,但收效甚微。
另一个问题,据我了解,ExoPlayer 是基于 构建的MediaCodec
,那么为什么它可以很好地播放 iOS 录制的视频,而 MoviePlayer 的纯实现MediaCodec
却不能呢?
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
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 中完成此操作的任何帮助,我们将不胜感激。此外,如果您有很棒的文章可以帮助我了解有关视频、编解码器、视频处理等的细节/基础知识,那也会有所帮助。
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 位置?)。希望这会对某人有所帮助。
android - MediaExtractor - readSampleData() 的第一个结果是 -1
我正在尝试使用 Android 从视频文件中提取帧MediaExtractor
,但由于某种原因,第一个结果readSampleData()
是 -1。我究竟做错了什么?
文件本身当然是可播放的。
android - ExtractMpegFramesTest 示例在 API23 设备上不起作用
我试图在一些 android 设备上运行这个 bigflake 示例。
我在 Galaxy S3、S4 和 S7 上试过。
对于 Galaxy S3,一切正常。我已经拍摄了第一帧,这就是我所拥有的:
然后我尝试在 Galaxy S6 和 S7 上运行相同的代码,但随后我收到了相同视频的奇怪图像
有人(fadden lol)知道什么可能导致这个问题吗?
android - MediaCodec/MediaExtractor - 尝试从第二个 MediaExtractor 到第二个解码器的 queueInputBuffer 时出现 libexynosv4l2 错误
在我尝试使用 MediaCodec 连接视频的过程中,我尝试使用两个MediaExtractor
s,每个都与 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
编辑:
我仔细查看了堆栈跟踪,发现了这些:
我需要在解码器设置中更改什么?
android - 如何处理 Android MediaCodec 解码器的第一个输出 ByteBuffers?
我正在尝试使用 Android 的 MediaCodec 套件编写音频重采样器。
我目前正在将 MP3 立体声音频文件输入 MediaExtractor,然后由 MediaCodec 解码。源音频的采样率为 48000。
我不明白的是我从解码器收到的前四个输出缓冲区:
- 尺寸 0,时间 0
- 大小 0,时间 24000
- 尺寸 4312,时间 48000
- 尺寸 4608,时间 72000
- 尺寸 4608,时间 96000
- 等等
从这个答案,这个答案和这篇文章,我相信前两个缓冲区只是传播“编码器延迟”,可能会被丢弃。但是,我列出的第三个缓冲区让我陷入了循环。
对于缓冲区 #4(及以后),数学计算如下:
缓冲区 #3 发生了什么?对数据的直接理解表明,音频在 48000 us 时间开始播放,然后在 72000 us 标记之前暂停,此时它开始连续播放,没有中断。
似乎更有可能在缓冲区#3 的数据之前有 296 个隐藏的 0,但是我的代码中的任何变量似乎都没有指示这个偏移量。任何人都可以为我阐明这一点吗?