问题标签 [mediamuxer]

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 投票
2 回答
678 浏览

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

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

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

0 投票
1 回答
918 浏览

android - MediaMuxer.nativeWriteSampleData 在视频录制期间总是周期性地阻塞大约一秒钟

我正在使用 mediacodec + mediamuxer 进行 android 视频录制,现在我可以录制视频并生成可以播放的 mp4 文件。问题是我发现录制的视频会占用大约一秒钟的时间。所以我启动了 traceview,我发现 MediaMuxer.nativeWriteSampleData() 导致了问题。有时这个函数很快,在几微秒内返回,但有时这个函数很慢,会消耗大约一秒左右,此时视频块。我不知道为什么这个功能会时不时地执行如此不同。录制的目标文件位于外部 SDCard 或内部存储,两个媒体都存在问题。

0 投票
1 回答
3316 浏览

android - MediaCodec 编码器(I420、NV12、Planar、Semi-Planar 等)有何不同(如果有)?

参考这个页面:http ://bigflake.com/mediacodec/

A5。相机输出和 MediaCodec 编码器输入的颜色格式不同。相机支持 YV12(平面 YUV 4:2:0)和 NV21(半平面 YUV 4:2:0)。MediaCodec 编码器支持以下一项或多项:

#19 COLOR_FormatYUV420Planar (I420)

#20 COLOR_FormatYUV420PackedPlanar(也是 I420)

#21 COLOR_FormatYUV420SemiPlanar (NV12)

#39 COLOR_FormatYUV420PackedSemiPlanar(也是 NV12)

#0x7f000100 COLOR_TI_FormatYUV420PackedSemiPlanar(也是 NV12)

在我的应用程序中,我从外部摄像头以 YUY2 格式捕获帧,将它们转换为可用格式,并将它们提供给 MediaMuxer。

根据我在这里阅读的内容,这意味着我需要使用 MediaCodecInfo.CodeCapabilities 查询设备支持的内容。然后,基于此,将 YUY2 转换为适当的格式。至少这是我的理解。

在编解码器格式的海洋中,我不确定它们之间的差异以及我是否需要在我的应用程序中考虑所有这些。如果是这样,我需要知道这些格式的字节布局。我已经填写了我认为正确的那些。从顶部开始向下移动:

格式YUV420Planar - YYYY YYYY UU VV

FormatYUVPackedPlanar - ???

格式YUV420SemiPlanar -- YYYY YYYY VU VU

格式YUV420PackedSemiPlanar -- ???

COLOR_TI_FormatYUV420PackedSemiPlanar -- ???

0 投票
8 回答
10658 浏览

android - MediaMuxer 视频文件大小减小(重新压缩,降低分辨率)

我正在寻找有效的方法来减少一些视频的重量(作为File上传),显而易见的答案是:让我们降低分辨率!(不需要全高清或 4K,简单的高清对我来说就足够了)我尝试了很多应该通过很多 API 工作的方法(需要 10 个),最好的方法是使用android-ffmpeg-java,但是......在我漂亮的快速几乎当前的旗舰设备整个过程持续大约 length_of_video*4 秒,而且这个库的重量是 9 Mb,这个数量增加了我的应用程序大小......不!(12 Mb 到 1 Mb 是不错的结果,但仍然有太多缺陷)

所以我决定使用原生 Android 方法来做到这一点,MediaMuxer并且MediaCodec- 它们分别可从 API18 和 API16 获得(旧设备用户:抱歉;但他们也经常有“低分辨率”相机)。下面的方法几乎可以工作 -MediaMuxer不要尊重MediaFormat.KEY_WIDTH-MediaFormat.KEY_HEIGHT提取File的是“重新压缩”,重量有点小,但分辨率与原始视频相同File......

MediaMuxer所以,问题:如何使用和其他附带的类和方法来压缩和重新缩放/更改视频的分辨率?

PS。这里有很多关于 muxer 的有用的东西,上面的代码基于MediaMuxerTest.java,方法cloneMediaUsingMuxer

0 投票
0 回答
1537 浏览

android - 使用 MediaCodec 和 MediaMuxer 将位图编码为电影,并为每个图像自定义呈现时间

我正在尝试从一系列位图创建电影。我想以 API 19 为目标,但如果它在设备上可用,也可以利用 API 21。

我一直在阅读 bigflake CTS 测试,尤其是这里的 EncodeAndMux 和 EncodeDecodeTest

我想使用 MediaCodec 和 MediaMuxer 类,而不是 FFMpeg 或 Jcodec 等。

我将不胜感激任何帮助指出我哪里出错以及如何解决它。我是 Android 新手,为此苦苦挣扎了好几天!我正在三星 Galaxy Note 3 上进行测试

更新:我能够访问 EOS,但在尝试释放编码器时出现编解码器错误。

这是更新的代码:

和更新的 logcat 错误:

0 投票
1 回答
2782 浏览

android - Android MediaCodec:eglSwapBuffers:EGL 错误:0x300d

所以问题只有在我第二次尝试录制时才会出现。这意味着我第一次运行 MediaCodecs 和 Muxer 时,大部分时间一切正常。但现在我希望应用程序更稳定。

帮助找出没有被拆除并正确设置的内容。

基本上在第二次运行时,一切设置都很好,但是当“Renderer.drawFrame”调用时GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);出现错误:I/Adreno﹕ Native window GetBuffer failed

GLES20.glFlush();被称为错误是:I/Adreno﹕ Failed to acquire a surface

eglSwapBuffers: EGL error: 0x300d当我尝试交换缓冲区时,它总是先于。所以有些东西从第一次运行就没有得到清理。

清理代码:

MyMediaCodec.stop()

MyMediaMuxer.stop()

mEGLWrapper.destroySurface();

错误日志

0 投票
0 回答
318 浏览

android - Combine EncodeAndMux with HelloEffects in Android

I am trying to create a video with a series of images using MediaCodec and MediaMuxer. I want to also apply an Effect on each Bitmap before the encoding.

The video gets created with the correct duration but the output is only black screen.

I have been looking at the EncodeAndMux example at bigflake.com (Modified the generateFrame() and added a shared context when creating the CodecInputSurface )

and the HelloEffects from Google to setup the EffectFactory.

My idea was to create 2 EGLContexts - one for rendering the effect and one for the MediaCodec(encoder) and swapping the buffers

I am new to OpenGl and Android so please tell me if I am going about this the wrong way. Any help with helping me understand what the problem is would be greatly appreciated

Here is my code :

public class WriteMovieActivity extends Activity {

}

This is the logcat:

0 投票
1 回答
1631 浏览

android - mp4Parser:如何从 mp3 文件创建带有背景音频的视频文件

我正在尝试创建一个使用 mp4Parser 合并视频和音频文件的 android 应用程序。当我将两个 mp4 文件合并为一个显示第一个文件的视频并播放第二个文件的音频的文件时,我成功了。

但我不能使用 mp3 文件作为音频源。

当我尝试使用 mp3 文件创建 Movie 对象时,以下代码返回异常。相同的代码适用于 m4a 和 mp4 文件。

是否可以从 mp3 文件创建 Movie 对象?

任何人都请帮助我

0 投票
1 回答
6556 浏览

android - 使用 MediaCodec 和 MediaMuxer 录制视频,但码率和帧率不正确

我编写了一个演示来使用 MediaCodec 和 MediaMuxer 录制视频。

我用我的demo录制了一段视频,用ffprobe查看视频,结果如下:

它包含视频和音频信息,我发现音频属性与我在源代码中设置的相同,但视频属性并不完全正确。我的视频设置源代码如下:

视频的宽度和高度是正确的,但比特率和帧率高于我在源代码中设置的。这导致视频文件大小比我预期的要大得多。然后,我修改了我的源代码以删除音频录制线程,只录制视频。但它没有任何区别,比特率和帧率也更高。谁能告诉我原因并给我一些建议?

还有另一个问题。我偶尔会录一段坏掉的视频,可以用系统播放器播放,但视频的开头只是黑色,1或2秒后显示正常图像。我不知道如何在 stackoverflow 中上传文件,我可以将损坏的视频文件发送给任何需要它的人。有人遇到这个问题吗?

ADD:我发现了另一个奇怪的东西:我的视频编码配置:

但实际的视频信息是:

0 投票
1 回答
1937 浏览

android - 如何在使用 MediaCodec 和 InputSurface 录制时丢帧?

在我的 Android 应用程序中,我想用 Time-lapse 录制视频。我有一个 InputSurface -> MediaCodec(编码器)-> MediaMuxer。

但是,如果我想加快视频速度(例如:x3),我会得到具有非常高帧率的结果视频。例如:以正常速度,我得到 30fps 的视频。如果我加快速度(x3),我会得到 90fps 的视频。

由于视频的帧率很高,我手机的视频播放器无法正常播放视频(电脑的视频播放器播放视频没有任何问题)。所以我认为我必须丢掉一些帧以保持帧率低于 60fps。

但我不知道如何丢帧。因为在 AVC 流中,我们有 I、B、P 帧,它们可能依赖于其他帧,所以我们不能随意丢弃它们。有谁能够帮我?