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

android - 如果 csd-1 不存在,MediaMuxer 将无法停止

我正在使用MediaExtractor从视频文件中提取视频和音轨,然后将它们再次提供给MediaMuxer.

如果提取的媒体格式同时包含csd-0csd-1并且转换后的视频运行良好,则代码运行良好。但是,有些视频只有csd-0,这些视频会导致应用程序在MediaMuxer.stop().

这是堆栈跟踪:

0 投票
1 回答
971 浏览

android - 用于 RTMP 流媒体的 MediaCodec 编码器输出缓冲区的扩展客户端所有权

背景:

我已将 Android 的 MediaCodec 连接到 FFmpeg,用于混合 MediaMuxer 不支持的各种格式,包括rtmp://通过.flv容器输出。此类流式多路复用器需要更长且不可预测的 MediaCodec 输出缓冲区所有权,因为它们可能在任何数据包处理步骤上执行网络 I/O。对于我的视频流,我使用为 Surface 输入配置的 MediaCodec。为了将复用与编码分离,我通过一个处理程序将 MediaCodec 的 ByteBuffer 输出缓冲区排队到我的复用器。

.flv如果我将输出复用到文件而不是 rtmp 端点,那么所有工作都非常出色。

问题:

当复用到rtmp://...端点时,我注意到我的流应用程序立即开始阻止调用我eglSwapBuffers(mEGLDisplay, mEncodingEGLSurface)dequeueOutputBuffer()复用队列中保留了几个 MediaCodec 输出缓冲区,因为 MediaCodec 似乎只锁定到 4 个输出缓冲区。

有什么技巧可以避免复制由返回MediaCodec#dequeueOutputBuffers并立即调用的所有编码器输出releaseOutputBuffer(...)

我的项目的完整源代码可在Github上找到。具体见:

  • AndroidEncoder.java:在音频和视频编码器之间具有共享行为的抽象编码器类:主要是 drainEncoder()。将数据写入Muxer实例。
  • FFmpegMuxer.java:实现Muxer
  • 相机编码器.java。将相机帧发送到为视频编码配置的 AndroidEncoder 子类。

系统跟踪

系统跟踪输出

这是一些 systrace 输出流式传输 720p @ 2Mbps 视频到 Zencoder。

解决了

复制并在 MediaCodec 编码器输出 ByteBuffer 可用时立即释放它们可以解决问题,而不会显着影响性能。我为每个复用器轨道回收了 ByteBuffer 副本ArrayDeque<ByteBuffer>,这限制了分配的数量。

0 投票
1 回答
7795 浏览

android - Android MediaMuxer 无法停止

我正在尝试使用 MediaCodec、MediaExtractor 和 MediaMuxer 来生成 mp4 文件。EveryThing 似乎工作正常,但是当我调用 MediaMuxer.stop 时出现错误。MP4 文件已创建,但我无法使用播放器播放。

这是我的日志:

任何线索为什么停止失败?

0 投票
1 回答
1072 浏览

android - 如何在视频系统中捕获和编码音频_Android

我正在尝试在 android 中构建一个开源视频系统,因为我们无法访问封闭系统中的数据。在这个系统中,我们可以修改相机捕获的原始数据。

我使用 MediaCodec 和 MediaMux 来完成视频数据编码和复用工作,并且工作正常。但我不知道音频部分。我使用 onFramePreview 来获取每一帧并逐帧进行编码/混合工作。但是我如何同时进行音频录制(我的意思是逐帧捕获音频,对其进行编码并将数据发送到 MediaMux)。

我做了一些研究。似乎我们使用audiorecorder来获取音频的原始数据。但是audiorecorder做一个持续的录音工作,我不认为它可以工作。

谁能给我一个提示?谢谢!

0 投票
3 回答
216 浏览

android - 如何将数据从一个 AsyncTask 发送到另一个 AsyncTask?[视频系统]

我正在尝试分别捕获音频数据和视频数据,并将它们编码/混合到 .mp4 文件中。对于音频录制和视频编码都是耗时的工作,我为它们打开了两个 AsyncTasks。

问题来了,我需要将录音任务的数据发送到视频编码任务。但是我没有找到关于 AsynTasks 之间通信的东西。

谁能给我一个提示?谢谢!

0 投票
1 回答
1140 浏览

android - MediaCodec signalEndOfInputStream() 错误

我正在尝试使用示例代码 Grafika 中的 Live Camera Recording (With Opengl)。在我的 Moto G 上一切正常,但我在我的其他设备(带有 Cyanogendmod 11 的 Galaxy Tab 2)上尝试,似乎方法:signalEndofInputStream() 不起作用,编码器永远不会停止。有没有办法以其他方式将信号发送到 MediaCodec?

抱歉英语不好。

0 投票
1 回答
137 浏览

android - any good ways to do mediamuxer on android?

I am trying to build a video system on android. I am using the sample provided by Qualcomm, which allows me to use openmax and do hardware-acceleration on Qualcomm customer device.

Anyway, this sample only generates .h264 file. So I am looking forword a good way to do the muxer work. I've used MediaMuxer before, but it supports system later than android4.3, so this doesn't work on this sample. (Qualcomm sample only support android4.2 and before)

Does anyone have any ideas? Thank you!

0 投票
2 回答
7412 浏览

android - 在 Android 上使用 MediaMuxer 录制音频和视频

我正在尝试使用 Android 4.3 中提供的 , 录制音频和视频但是AudioRecord,有时音频编码器线程会停止并且不再编码。结果是一个损坏的 mp4 文件,因为复用器没有接收到任何编码的音频帧。在我的三星 Galaxy Note 3 上,它的工作率为 99%,但在我的索尼 Xperia Z1 上,编码线程总是卡住。我真的不知道是什么原因,也许有人可以帮我优化我的代码:MediaCodecMediaMuxer

录音机.java

谢谢你的帮助。

0 投票
0 回答
1053 浏览

android - Android MediaMux & MediaCodec too slow for saving video

My Android app does live video processing using OpenGL. I'm trying to save it to video using MediaMuxer and MediaCodex.

The performance it not good enough. Each cycle the screen is updated, and it is saved to file. The screen is smooth, the video file is horrible. By this I mean major motion blur when it changes quickly and the frame-rate appears to be 1/2 or 1/3rd of what it should be.

It seems to be a limitation due to clamping of settings internally. I can't get it to spit out a video with a bit rate greater than 288KBPS. I think it is not clamping the requested parameters because there is no difference in frame rate for 1024x1024, 480x480, and 240x240. If it was having trouble keeping up, it should at least improve when the number of pixels drops by a factor > 10.

The app is here : https://play.google.com/store/apps/details?id=com.matthewjmouellette.snapdat.

I would love to post a code sample, but my program is 10K lines of code, with a lot of relevant code just for this problem.

Any help would be greatly appreciated.

EDIT:

I've tried like 10+ different things. I'm out of ideas right now. I wish I could just save the video uncompressed, the hard-drive should be able to keep up with a small enough image and medium fps.

It seems to be that the encoding method just doesn't work for my video. The frames differ to much, to try to "move" one part of the frame, as a sort of encoding. Instead I need full frames throughout. I am thinking something along the lines of M-JPEG would work really well. JPEGs tend to take 1/10th the size of a bitmap. It should allow a reasonable size, with almost no processing power required by the CPU, since it is image compression not video compression which we are doing. I wish I had a good library for this.

0 投票
1 回答
140 浏览

android - 【Android源码学习】IMediaRecorder.cpp是如何做Muxer工作的?

我想从MediaRecorder.java.

我一直在看android源码,版本是Jellybean(4.2.2)。对应的是android_media_MediaRecorder.cppMediaRecoder.cpp,但是函数中没有明确定义媒体复用器进程start()。所以我阅读了IMediaRecorder.cpp,但仍然没有明确的定义:

我现在不知道该看什么...有人知道吗?感谢您的任何建议!