问题标签 [muxer]

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 回答
4209 浏览

open-source - java中的开源mp4多路复用器

是否有任何可用的开源 MP4 多路复用器/编写器 java 项目(用 java 编写的源代码,没有本机代码)?

我将 H.264 和 AAC 原始/基本流存储在单独的文件中。我想混合它们并获取包含音频和视频的 .mp4 视频文件。

提前感谢您的宝贵建议。

0 投票
3 回答
1914 浏览

android - android 4.1+ 中的 MP4 文件编写器

从 Android 4.1(API 级别 16)开始,引入了 MediaCodec API。这些 API 支持基本流解码和编码。此外,MediaExtractor API 将通过分析媒体流来提供基本的轨道详细信息。

我的问题是,我使用 MediaCodec API 设置了一个视频编码器,它为我提供了 .h264 格式的编码文件。我想将 .h264 文件写入 .mp4 文件以进行播放/存储/共享。我没有找到任何适用于 android 的 .MP4 文件编写器 API。有没有办法实现它?

谢谢,萨蒂什。

0 投票
3 回答
7505 浏览

ffmpeg - 如何使用 libavformat 连接 2 个具有相同编解码器的视频文件(重新混合)?

我已经从 CDN 下载了 flv 格式的视频(视频 H264 和音频 AAC),并将它们重新合成为 MP4 格式。但是视频受长度限制。所以我已经分几个部分下载了每个视频:从起点开始,在第 1 点,在第 2 点(通过在 url 中使用 seek 参数)。每个点的开始时间都比前一个点的结束时间早一点。
使用av_read_framei 扫描所有部分,发现相交的数据包不仅具有相同的大小和顺序,而且它们的 dts/pts 彼此偏移恒定值。因此,要将开始视频与从点 1 开始的视频连接起来,我必须执行以下操作:
1. 在输出文件中创建输出标头
2. 从开始视频中复制所有不相交的数据包。
3. 从点 1 开始的视频中复制所有不相交的数据包,并通过将其移动常量来更改 dts 值

如何使用 libav(不是 ffmpeg)来完成所有这些工作?我阅读了如何在不使用其他 libav 库的情况下使用 libavformat。但libav它不起作用,因为没有avformat_alloc_output_context2. libav对于像我这样的新手来说,源avconv.c代码太复杂了,无法隔离与流复制操作相关的部分。
有人可以给我举个例子:
- 打开input_file1input_file2(仅当程序与通用教程中的标准不同时才需要)
- 打开并写入具有相同容器格式和相同视频和音频格式的output_file
标头 - 将数据包从input_file1写入output_file直到数据包,例如pos == XXX
- 将数据包从input_file2写入output_file,通过常量值更改它们的 dts(或任何需要)
- 写入正确trailer

计算我之前制作的 dts 中的时间偏移。

0 投票
2 回答
8702 浏览

android - 使用 Jcodec 在 Android 上创建 mp4 文件

我在使用 MediaRecorder 和 Jcodec 在 Android 上编写 mp4 文件时遇到了一些麻烦,这是我的代码

正如我们所见,Android MediaCodec 期望 YUV420SemiPlanar 作为输入图像,所以我给了他正确的图像。结果我有一个损坏的 mp4 文件,颜色无效,当我从 AVCon 打开这个 mp4 文件时,我看到输出文件中的颜色格式是 yuv420p,所以可能是问题所在?请建议如何解决这个问题。

还有另一个问题,如何将压缩音频流添加到复用器,没有找到示例。

0 投票
3 回答
1922 浏览

android-4.3-jelly-bean - 输入为 Surface 的媒体编解码器 API 无法与 H264 编码器一起使用(bigflake 示例代码)

我正在尝试在 4.3 上运行带有 H264 编码器的媒体编解码器 API 的示例代码,在 bigflake 的以下链接中进行了解释

http://bigflake.com/mediacodec/CameraToMpegTest.java.txt

我遇到了以下问题。-> 在 H264 编码器代码中,颜色格式、高度和宽度没有得到更新,因为 getpatameter 实现存在问题。所以我应用了这个补丁(https://code.google.com/p/android/issues/detail?id=58834)。-> 应用补丁后,编码器也不编码 -> 我看到像 D/CameraToMpegTest(3421) 这样的观察结果:编码器输出格式已更改:{csd-1=java.nio.ByteArrayBuffer[position=0,limit=8 ,容量=8],高度=144,mime=video/avc,csd-0=java.nio.ByteArrayBuffer[位置=0,限制=12,容量=12],什么=1869968451,宽度=176}

那么为什么这个值会被改变,不知道......之后我们总是看到编码器将 queueOutputBuffer 的状态提供为 INFO_TRY_AGAIN_LATER。所以它创建了文件,但它不编码任何东西,它停止为

I/MPEG4Writer(3421):接收到总/0 长度 (0/0) 缓冲区并编码 0 帧。- 视频

D/MPEG4Writer(3421):停止视频轨道

D/MPEG4Writer(3421):停止视频轨道源

D/MPEG4Writer(3421):视频轨道停止

D/MPEG4Writer(3421):停止编写器线程

D/MPEG4Writer(3421): 最后一批写入了 0 个块

D/MPEG4Writer(3421):编写器线程已停止

因此,据我所知,它应该可以工作,但看起来编码器仍然没有正确配置......

请指导这...谢谢

内哈尔

0 投票
1 回答
1961 浏览

android - Android MediaMuxer 将 Surface 附加到编解码器输入

好的,我已经查看了Fadden 的实现 Android MediaMux 的示例。我不知道如何让我的场景进入 MP4 多路混合编解码器的表面输入。我正在开发一个音频处理器,它会占用音频和视频 I/O,因此 MediaRecord 失败,但 MediaMux 听起来是一个可行的解决方案。

从编解码器创建一个 inputSurface:

我已经实现了 openGLSurfaceView。我可以简单地通过调用从视图中获取表面:

但这并没有设置表面。它只是抓住它。有没有一种简单的方法可以让 myGLSurface 写入 videoInputSurface。

为了使事情进一步复杂化,我将cameraPreview添加到同一个视图组vg中,myGLView被写入:

并且 myGLView 设置为透明,以便 openGL 场景覆盖在 cameraPreview 之上。

有没有一种简单的方法可以获取 vg 的表面元素?简单地将正在写入 vg 帧的内容放在编解码器的 videoInputSurface 上?

谢谢,

0 投票
1 回答
3516 浏览

android - Android MediaMuxer 非法状态异常无法停止 muxer mMediaMuxer.stop()

我在停止 MediaMuxer 时遇到问题。

除了我使用音频之外,几乎一直遵循fadden 的示例,所以我还不能 100% 确定音频和视频轨道排成一行。这可能是问题所在。

当我命中 mMediaMuxer.stop() 的断点时,我收到一个致命错误:

当我调用 stop 时,我可以深入了解 MediaMuxer.mState = MUXER_STATE_INITIALIZED。但它在 nativeStart(mNativeObject) 中失败了......

0 投票
3 回答
15437 浏览

android - MediaMuxer 错误“无法停止混合器”

我正在Camera使用 mime 类型“video/avc”对预览数据进行MediaCodec编码,并将编码数据(仅视频,无音频)传递给MediaMuxer. 多路复用器似乎运行良好并创建了一个合理大小的输出文件(即,我记录的时间越长越大)。但是,当我尝试停止多路复用器时,我收到“无法停止多路复用器”错误:

在失败停止之前有一些可疑的 MPEG4Writer 日志消息:

任何线索是什么原因造成的?不确定您还需要什么信息。

0 投票
0 回答
194 浏览

android-camera - 用于同步摄像头的 MediaCodec

我正在使用 MediaCodec API 开发同步摄像机流和录制。我想合并来自相机的帧并提供给渲染以及 Mediacodec 以记录为表面。我不想创建多个 EGLContext 而是应该使用相同的。我以 Bigflake 媒体编解码器示例作为参考,但我不清楚这是否可能。还有如何绑定多个纹理?因为我们需要两个相机的两个纹理。您的宝贵意见将帮助我进一步进步。目前我被卡住了,不清楚下一步该怎么做。

问候内哈尔

0 投票
3 回答
2562 浏览

android - 在 Android 4.1/4.2 设备中将 MediaCodec.getOutputFormat() 用于编码器的问题

我正在尝试使用 MediaCodec 将帧(通过相机或解码器)编码为视频。通过dequeueOutputBuffer()处理编码器输出时,我期望收到返回index = MediaCodec.INFO_OUTPUT_FORMAT_CHANGED,所以我可以调用getOutputFormat()获取编码器输出格式作为当前使用的ffmpeg复用器的输入。

我已经测试了一些 Android 版本 4.1~4.3 的平板/电话设备。它们都具有至少一个硬件视频 AVC 编码器并用于测试。在 4.3 版本的设备上,编码器在按预期写入编码数据之前给出 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED,并且从 getOutputFormat() 返回的输出格式可以被复用器正确使用。在 4.2.2 或更低版本的设备上,编码器从不提供 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED,但它仍然可以输出编码的基本流,但复用器无法知道确切的输出格式。

我想问以下问题:

  1. 编码器的行为(在输出编码数据之前是否提供 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)是否取决于 Android API 级别或单个设备上的芯片?
  2. 如果编码器在 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED 出现之前写入数据,有没有什么办法可以得到编码数据的输出格式?
  3. 编码器仍然在编码数据之前在设备上输出编解码器配置数据(带有标志 MediaCodec.BUFFER_FLAG_CODEC_CONFIG)。它主要用于配置解码器,但我可以通过编解码器配置数据导出输出格式吗?

我尝试了这些解决方案来获取输出格式但失败了:

  • 在整个编码过程中频繁调用 getOutputFormat()。但是,它们都抛出 IllegalStateException 而没有出现 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED。
  • 在开始时使用初始 MediaFormat 配置编码器,如示例:

    但是它失败了,因为编码器的输出格式仍然从最初的格式“改变”。

请帮助我实现编码器的行为,如果缺少所需的 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED,是否有任何解决方案来查询输出格式。


通过比较输出格式和编解码器配置数据,缺少的字段是csd-0,csd-1,以及一个value = 1869968451的“what”字段。(我不明白“what”字段。它似乎是一个常数,不是必需的。谁能告诉我它的含义?)

如果我将编解码器配置数据解析为 csd-1 字段(最后 8 个字节)和 csd-0 字段(剩余字节),则复用器似乎可以正常工作并输出可在所有测试设备上播放的视频。(但我想问:这个 8 字节的假设是否正确,还是有更可靠的方法来解析数据?)

但是,我遇到了另一个问题,如果我再次通过 Android MediaCodec 解码视频,则 dequeueOutputBuffer() 获得的 BufferInfo.presentationTimeUs 值对于大多数解码帧都是 0。只有最后几帧有正确的时间。MediaExtractor.getSampleTime() 获得的采样时间是正确的,并且正是我为编码器/复用器设置的值,但解码的帧时间不是。此问题仅发生在 4.2.2 或更低版本的设备上。

奇怪的是帧时间不正确,但视频可以在设备上以正确的速度播放。(我测试的大多数 4.2.2 或更低版本的设备只有 1 个 Video AVC 解码器。)我是否需要设置可能影响演示时间的其他字段?