问题标签 [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.
open-source - java中的开源mp4多路复用器
是否有任何可用的开源 MP4 多路复用器/编写器 java 项目(用 java 编写的源代码,没有本机代码)?
我将 H.264 和 AAC 原始/基本流存储在单独的文件中。我想混合它们并获取包含音频和视频的 .mp4 视频文件。
提前感谢您的宝贵建议。
android - android 4.1+ 中的 MP4 文件编写器
从 Android 4.1(API 级别 16)开始,引入了 MediaCodec API。这些 API 支持基本流解码和编码。此外,MediaExtractor API 将通过分析媒体流来提供基本的轨道详细信息。
我的问题是,我使用 MediaCodec API 设置了一个视频编码器,它为我提供了 .h264 格式的编码文件。我想将 .h264 文件写入 .mp4 文件以进行播放/存储/共享。我没有找到任何适用于 android 的 .MP4 文件编写器 API。有没有办法实现它?
谢谢,萨蒂什。
ffmpeg - 如何使用 libavformat 连接 2 个具有相同编解码器的视频文件(重新混合)?
我已经从 CDN 下载了 flv 格式的视频(视频 H264 和音频 AAC),并将它们重新合成为 MP4 格式。但是视频受长度限制。所以我已经分几个部分下载了每个视频:从起点开始,在第 1 点,在第 2 点(通过在 url 中使用 seek 参数)。每个点的开始时间都比前一个点的结束时间早一点。
使用av_read_frame
i 扫描所有部分,发现相交的数据包不仅具有相同的大小和顺序,而且它们的 dts/pts 彼此偏移恒定值。因此,要将开始视频与从点 1 开始的视频连接起来,我必须执行以下操作:
1. 在输出文件中创建输出标头
2. 从开始视频中复制所有不相交的数据包。
3. 从点 1 开始的视频中复制所有不相交的数据包,并通过将其移动常量来更改 dts 值
如何使用 libav(不是 ffmpeg)来完成所有这些工作?我阅读了如何在不使用其他 libav 库的情况下使用 libavformat。但libav
它不起作用,因为没有avformat_alloc_output_context2
. libav
对于像我这样的新手来说,源avconv.c
代码太复杂了,无法隔离与流复制操作相关的部分。
有人可以给我举个例子:
- 打开input_file1和input_file2(仅当程序与通用教程中的标准不同时才需要)
- 打开并写入具有相同容器格式和相同视频和音频格式的output_file
标头
- 将数据包从input_file1写入output_file直到数据包,例如pos == XXX
- 将数据包从input_file2写入output_file,通过常量值更改它们的 dts(或任何需要)
- 写入正确trailer
计算我之前制作的 dts 中的时间偏移。
android - 使用 Jcodec 在 Android 上创建 mp4 文件
我在使用 MediaRecorder 和 Jcodec 在 Android 上编写 mp4 文件时遇到了一些麻烦,这是我的代码
正如我们所见,Android MediaCodec 期望 YUV420SemiPlanar 作为输入图像,所以我给了他正确的图像。结果我有一个损坏的 mp4 文件,颜色无效,当我从 AVCon 打开这个 mp4 文件时,我看到输出文件中的颜色格式是 yuv420p,所以可能是问题所在?请建议如何解决这个问题。
还有另一个问题,如何将压缩音频流添加到复用器,没有找到示例。
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):编写器线程已停止
因此,据我所知,它应该可以工作,但看起来编码器仍然没有正确配置......
请指导这...谢谢
内哈尔
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 上?
谢谢,
android - Android MediaMuxer 非法状态异常无法停止 muxer mMediaMuxer.stop()
我在停止 MediaMuxer 时遇到问题。
除了我使用音频之外,几乎一直遵循fadden 的示例,所以我还不能 100% 确定音频和视频轨道排成一行。这可能是问题所在。
当我命中 mMediaMuxer.stop() 的断点时,我收到一个致命错误:
当我调用 stop 时,我可以深入了解 MediaMuxer.mState = MUXER_STATE_INITIALIZED。但它在 nativeStart(mNativeObject) 中失败了......
android - MediaMuxer 错误“无法停止混合器”
我正在Camera
使用 mime 类型“video/avc”对预览数据进行MediaCodec
编码,并将编码数据(仅视频,无音频)传递给MediaMuxer
. 多路复用器似乎运行良好并创建了一个合理大小的输出文件(即,我记录的时间越长越大)。但是,当我尝试停止多路复用器时,我收到“无法停止多路复用器”错误:
在失败停止之前有一些可疑的 MPEG4Writer 日志消息:
任何线索是什么原因造成的?不确定您还需要什么信息。
android-camera - 用于同步摄像头的 MediaCodec
我正在使用 MediaCodec API 开发同步摄像机流和录制。我想合并来自相机的帧并提供给渲染以及 Mediacodec 以记录为表面。我不想创建多个 EGLContext 而是应该使用相同的。我以 Bigflake 媒体编解码器示例作为参考,但我不清楚这是否可能。还有如何绑定多个纹理?因为我们需要两个相机的两个纹理。您的宝贵意见将帮助我进一步进步。目前我被卡住了,不清楚下一步该怎么做。
问候内哈尔
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,但它仍然可以输出编码的基本流,但复用器无法知道确切的输出格式。
我想问以下问题:
- 编码器的行为(在输出编码数据之前是否提供 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED)是否取决于 Android API 级别或单个设备上的芯片?
- 如果编码器在 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED 出现之前写入数据,有没有什么办法可以得到编码数据的输出格式?
- 编码器仍然在编码数据之前在设备上输出编解码器配置数据(带有标志 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 解码器。)我是否需要设置可能影响演示时间的其他字段?