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

android - Android 编码器复用器:原始 h264 到 mp4 容器

我创建了一个 h264 原始视频文件,并且能够在 Android 4.3 及更高版本上使用 Android MediaMuxer 对它进行多路复用。现在我需要支持 Android 4.1 和 4.2 版本。我找到了Jcodec。并且有一个这样做的例子:

https://github.com/jcodec/jcodec/blob/master/samples/main/java/org/jcodec/samples/mux/AVCMP4Mux.java

但我在第 70 行收到 java.nio.ReadOnlyBufferException 异常:

H264Utils.encodeMOVPacket(数据);

我猜这段代码不适用于Android?我该如何解决。熟悉Jcodec的人可以帮忙吗?

0 投票
0 回答
82 浏览

android - 如何提取FFMpeg的Muxer部分

我已经基于高通的示例构建了一个编码器,它可以捕获视频并将其压缩为 h264 文件。我使用的是安卓 4.2.2。现在我想把这个文件混合成 mp4(只有视频,没有音频)。

我听说 FFMpeg 可以完成这项工作。但是在阅读了示例之后,我发现复用器使用的是 FFMpeg 的编码器。我不知道如何在另一个编码器上使用复用器部分。

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

0 投票
1 回答
5173 浏览

gstreamer - 如何从 rtspsrc 解复用音频和视频,然后使用 matroska mux 保存到文件?

我一直在开发一个应用程序,我使用 rtspsrc 将音频和视频从一个网络摄像机收集到另一个网络摄像机。但是,我无法观看来自相机的流,因此无法验证流是否按预期工作。为了验证流是否正确,我想将其记录在 SD 卡上,然后在计算机上播放文件。问题是我希望相机尽可能多地进行解析、解码和卸载,因为这是应用程序的目的。

因此,我必须通过解复用器分离音频和视频流,并进行解析、解码等,然后将它们复用回 matroska 文件。

视频解码器已被省略,因为该相机尚未完成。

解复用到实时播放接收器(作品)

多个 rtspsrc 到 matroska(works)

单个 rtspsrc 到 matroska(失败)

最后一个示例失败并显示错误消息

我是否误解了 matroska mux 的用法,为什么上面的 2 个示例有效,但最后一个无效?

0 投票
1 回答
1597 浏览

ios - 将来自 VTCompressionSession 的压缩帧与音频数据混合到 MPEG2-TS 容器中以进行网络流式传输

我正在从事一个项目,该项目涉及从 iOS8 中的 VTCompressionSession 中获取 H.264 编码帧,将它们与来自麦克风的实时 AAC 或 PCM 音频混合到可播放的 MPEG2-TS 中,并通过套接字以最小的延迟实时流式传输(即:(几乎)没有缓冲)。

在观看了 iOS8 中新 VideoToolbox 的演示文稿并进行了一些研究之后,我想可以肯定地假设:

  • 你从 VTCompressionSession 得到的编码帧不是附件 B 格式,所以我需要以某种方式转换它们(到目前为止我看到的所有解释都太模糊了,所以我不太确定你是如何做到这一点的(即:将“3 或 4 字节标题替换为长度标题”))。

  • 您从 VTCompressionSession 获得的编码帧实际上是一个基本流。因此,首先我需要将它们转换为 Packetized Elementary Stream,然后才能对其进行复用。

  • 我还需要来自麦克风数据的 AAC 或 PCM 基本流(我认为 PCM 会更容易,因为不涉及编码)。我也不知道该怎么做。

  • 为了复用打包的基本流,我还需要一些像 libmpegts 这样的库。或者可能是 ffmpeg(通过使用 libavcodec 和 libavformat 库)。

我对此很陌生。我可以就实现这一目标的正确方法获得一些建议吗?

有没有更简单的方法来使用 Apple API(如 AVFoundation)来实现这一点?

有没有类似的项目可以作为参考?

提前致谢!

0 投票
0 回答
1357 浏览

android - 在编码器工作时为新视频文件重新创建复用器

我使用 BigFlake 的 CameraToMpegTest,但我对其进行了修改,以便在编码器工作时多次启用和停止多路复用器。当没有视频录制时,我仍然使用编码器从纹理中获取帧以进行其他处理。

对于第一次启动/停止它工作正常,但第二次启动/停止存在问题。我得到异常然后关闭应用程序:“stop() 在无效状态 3 下被调用”,“...引起:java.lang.IllegalStateException:无法停止多路复用器...”。第二个视频文件也没有打开,但它不是空的。

是否有可能在连续运行编码器的同时重新启动复用器?我究竟做错了什么?

更新:我在关键帧中发现了这个问题。当我设置 format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 0) 那么一切都很好。那么,当 muxer 再次开始录制时,如何请求关键帧?

混合器类:

0 投票
1 回答
4737 浏览

audio - FFMPEG - RTMP 到 HLS 没有音频输出

我目前正在为我们的 livecam 应用程序开发一个动态 HLS 分段器。因此,我捕获外部 RTMP 流并使用 ffmpeg 将其转换为段。

以下命令有效:

但是使用这个命令,我在直播和 HLS 输出之间确实有很大的延迟(大约 1-2 分钟!)。

所以我尝试了另一个命令,导致延迟为 20-30 秒!我唯一的问题是,音频流无法识别,也没有放入 HLS 文件(意味着我只有视频,但根本没有音频):

我想, -c:a aac 标志也应该完成混合音频的工作。

您对第二个命令出了什么问题有什么建议吗?我当然也必须对音频流进行分段!

提前致谢

更新:

FFMPEG 命令的一些输出:

我启动了命令(2),并获得了音频输出,但似乎并非每次都有效。

工作命令 2 的输出,音频工作: http: //pastebin.com/bhxfNQBg

工作命令 2 的输出,音频不工作(没有改变): http: //pastebin.com/engEuSdn

对我来说奇怪的是,这条线:

仅当 hls 端的音频不工作时才会发生这种情况。

任何帮助将不胜感激

更新 2:
在流已经发布后启动 ffmpeg 命令时似乎出现问题。
如果我按照这些步骤操作,一切正常:
1. 启动 Stream(与 AMS 的 nc 连接已建立)
2. 启动 FFMPEG 命令(它将空闲直到流发布)
3. 开始发布

但是如果我这样做(我们需要),则不会出现音频:
1. 启动 Stream
2. 用户加入,开始发布
3. 触发 ffmpeg 命令

0 投票
0 回答
841 浏览

video - FFMpeg 将 h264 复用到 mp4 结果文件未运行

我正在使用最新的 FFMPEG 3.0 编写代码以将 h264 文件复用到 mp4 中。Muxing 正在工作,但生成的 mp4 文件没有显示视频,只有当我播放生成的 mp4 文件时正在运行。请尝试帮助解决这个问题。请告诉我我错过了什么。这是我的代码:

0 投票
1 回答
1094 浏览

c - 使用 C/C++ 中的 ffmpeg 库从 CCTV (HW) 编码器将 H.264 多路复用到 MP4,如何获取 AVCodecContext::extradata

我正在尝试将通过闭路电视摄像机的 SDK API 接收到的数据包中的视频复用到 mp4 文件。来自 CCTV 的流似乎只包含 h264 I 和 P 帧的数据包(没有 B 帧)。

问题是,当我将 AVCodecContext::extradata 留空时,该文件无法在 Daum PotPlayer 中播放,但是,我可以在 VLC 中播放该文件。如果我提供额外的数据(可能不正确 - 我只是从从硬件编码器接收到的数据包中复制前 50 个字节),则该文件可以在 PotPlayer 中播放,但不能在 VLC 中播放。

我不知道,如何正确准备额外数据。

下面的代码显示了复用。

看来,来自相机的数据包(缓冲在 tmpRawFrameBuffer 向量中)包含一些标头,但我无法解析它们,我不明白标头的含义。

I 帧数据包的第一个字节看起来像下面的转储:

第一个 P 帧的第一个字节:

下一个 P 帧的第一个字节:

...

下一个 I 帧的开始:

有谁知道,如何正确填写额外数据?我只是复制了前 50 个字节,但似乎这是不正确的。

可能标头是 (AUD)(SPS)(PPS)(I-Slice)(PPS)(P-Slice)(PPS)(P-Slice) ... (AUD)(SPS)(PPS)(I-Slice )(https://stackoverflow.com/a/20686267/1699328),但是,我不知道如何为

我试图在这篇文章H.264 muxed to MP4 using libavformat not playing back中获得一些灵感,但我无法弄清楚 spsFrameLen、ppsFrameLen 和 spsFrame 的值是什么。

复用器的结果(mp4 文件的第一个和最后一个字节):

非常感谢您的任何建议。

0 投票
1 回答
3711 浏览

ffmpeg - ffmpeg 错误:数据看起来不像 RTP 数据包,请确保使用 RTP 复用器

我正在尝试通过 ffserver 从 usbcam 和 mic throw ffmpeg 流式传输视频和音频我收到 2 个错误:
- ffmpeg 似乎正在运行,但显示“数据看起来不像 RTP 数据包,请确保使用 RTP 多路复用器” - 我只能连接到 ffserver静态文件

这是 server.conf 文件:

我的 ffmpeg cmd 是

它似乎工作但显示此错误:

“数据看起来不像 RTP 数据包,请确保使用 RTP 复用器”

当我流式传输静态文件时它可以工作但是当我尝试播放 usbcam 流时抛出 ffplay 和 vlc 没有任何效果

先感谢您,

0 投票
1 回答
212 浏览

android - MediaCodecMuxer 编码视频太慢

我正在使用 MediaCodec Muxer 对视频进行编码,但是这个过程太慢了。有时 60 秒的视频,编码过程需要 90 多秒。编码计划来自 ExtractDecodeEditEncodeMuxTest(BigFlake),我将此示例解释为 jni 层。我不知道是因为我的代码中使用反射调用java api导致视频编码非常慢还是GLDisplay和MediaCodec inputSurface之间的交换过程导致了这个问题?我使用 eglCreateWindowSurface 创建 GLSurface,我想知道是否可以使用 eglCreatePbufferSurface 创建可以加快编码过程的离屏表面?任何人都可以提供一些建议吗?谢谢!