当前位置: 首页 > 知识库问答 >
问题:

MP4直播

皇甫文乐
2023-03-14

我在做一个在线电视服务。其中一个目标是在不使用任何其他浏览器插件(Flash除外)的情况下播放视频。

我决定使用MP4,因为它受到大多数HTML5浏览器和Flash(用于回退)的支持。视频通过FFMpeg从服务器上的ASF转码。

然而,我发现MP4不能实时流式传输,因为它有一个必须指定长度的元数据moov原子。FFMpeg不能直接将mp4流式传输到标准输出,因为它将moov放在文件的末尾。(MP4的实时转码和流式传输在Android中有效,但在带有NetStream的Flash播放器中失败。播放。文件结构无效错误)

当然,MPEG-TS是存在的,但HTML5不支持它

我想到的是一种将流实时转码到MP4的方法,在每次新的HTTP请求时,首先发送一个moov,指定视频长度的很长数字,然后开始发送MP4文件的其余部分。

有没有可能用MP4以这种方式进行流媒体传输?

经过一些研究和av501的回答,我明白必须知道帧的大小才能工作。

mp4文件能否分割成更小的部分,以便进行流式传输?

当然,切换到另一个容器/格式是一个选项,但与Flash和HTML5兼容的唯一格式是mp4/h264,因此如果我必须同时支持这两种格式,我必须进行两次代码转换。

共有3个答案

孔硕
2023-03-14

不,这不仅仅是非常长的长度...你需要知道每一帧的确切大小才能在mp4中创建标题。[这就是为什么它最终由各种编码器创建]。

庞安晏
2023-03-14

这是我的想法,伙计们,有些可能是对的,有些可能是对的。我以无知为借口,因为没有人真正完整地记录这个过程,这都是有根据的猜测。

AvAssetWriter只对文件进行编码,似乎无法将编码后的视频存储到内存中。从后台线程读取正在写入的文件,即套接字生成基本流,这本质上是一个m4v,它是一个包含h264/acc mdata的容器,但没有moov原子。(换句话说,没有标题)没有苹果提供的播放器可以播放这个流,但是基于ffplay的经过修改的播放器应该能够解码和播放这个流。这应该是可行的,因为ffplay使用可以解码基本流的libavformat,这是一个警告,因为没有文件长度信息,有些事情必须由播放、DTS和PTS决定,而且播放器不能在文件中搜索。

或者,可以使用来自m4v流的原始naul来构造rtmp流。

如果你想进一步讨论,可以直接与我联系。

你如何获得数据。

史蒂夫·麦克法林在他的github页面上写了一个小的AppleSegmentedRecorder,你可以找到它,这解决了moov atoms的一些问题,因为你有所有的文件信息。

任宾鸿
2023-03-14

你可以使用残缺的MP4。碎片化MP4文件的构建过程如下:

moov [moof mdat]+

moov框只包含关于曲目的基本信息(曲目数量、类型、编解码器初始化等),而不包含关于曲目中样本的信息。关于样本位置和样本大小的信息在moof box中,每个moof box后面都有一个mdat,其中包含前面moof box中描述的样本。通常,人们会选择(moof,mdat)对的长度约为2、4或8秒(没有关于这方面的规范,但对于大多数用例来说,这些值似乎是合理的)。

这是一种构建无休止MP4流的方法。

 类似资料:
  • 以下是从mp4文件中提取内容和元数据的程序 - import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.tika.exception.TikaException; import org.apache.tika.metadata.Metadata; impor

  • 该项目为 Python 实现可 Quicktime/MP4 视频流的快速定位。基于 ffmpeg 项目中的 qt-faststart.c。 该项目的目的是可以在无需编译下运行,Windows 和 OS X 用户在编译 qt-faststart.c 会有些麻烦。 特性: 使用 Python 编写,支持跨平台 可处理 32-bit (stco) 和 64-bit (co64) atoms Handle

  • 在与ffmpeg的斗争中,经过几天的混乱,我已经设法让它几乎做我想做的事情! 我有一个音轨和一系列的图像,要转换成幻灯片显示每个图像5秒。 null

  • 有没有办法告诉ffmpg将动画gif转换为比动画gif运行时间更长的mp4?Les说gif是4秒长的设置,可以像动画gif一样重复,但我需要10秒mp4。我将如何在ffmpg中实现它。我当前的转换行如下所示: ffmpeg-i$i.gif-c:v libx264-pix_fmt yuv420p-crf 4-b:v 300K-vf scale=320:-1-movflags faststart$i.

  • 所以,我正在使用这段代码压缩我的*MP4文件。我需要获得更低的质量和更低的比特率: 问题是:ffmpeg压缩后,最后一帧镜头被丢弃。屏幕截图在这里:screenshot_ffmpeg_drop帧

  • 我有一个响应站点,包含html5视频。我有一些javascript可以检查视频元素的大小是否低于某个阈值。如果是,它将移除控件,将视频播放按钮覆盖图像放置在视频元素的顶部,然后将click事件添加到保存视频元素的容器中。当点击容器时,它会将视频复制到一个模态对话框中并播放视频。 现在的困境是: webm版本没有任何问题。 modal视图的mp4版本在Safari中没有问题。 如果mp4播放到位(即