ffmpeg - 使用 avformat 的分段 mp4 广播
问题描述
我想用avformat
函数播放一个直播流(h264 -> 分段 mp4)。
现在基本上我有一个这个伪的工作示例:
avformat_write_header
while (!end) {
av_read_frame
av_write_frame
}
avformat_write_tailer
我有这个作为输出标志:movflags +frag_keyframe+empty_moov+default_base_moof
。
我将输出发送到播放良好流畅的 html5 视频。但是我想广播它,所以每当有新玩家出现时,我都想将相同的数据流式传输给它:
avformat_write_header
while (!end) {
av_read_frame
av_write_frame (to multiple clients)
}
avformat_write_tailer
然而,第一个客户端可以播放流,但其他客户端不能。
这是因为 fmp4 的结构:第一个客户端接收正确的ftyp
和moov
原子,而其余客户端则没有。
现在我可以破解我的代码以向后来的客户提供早期的 ftype 和 moov 原子,但我认为这不明智 - 如果我错了,请纠正我。
我的问题:
- 如何在流期间询问 avformat 以(计算)并包含 ftyp 和 moov 原子?
- 在流中包含 ftyp 和 moov 会破坏第一个客户端吗?(在 fmp4 中 ftype 和 moov 在开始时不是一次有效吗?)
谢谢
解决方案
ftyp 和 moov 一起被称为initialization fragment
并且客户端应该首先下载和处理它,不管它接下来打算播放什么片段。这不是 hack,这正是 fmp4 的工作方式。
推荐阅读
- reactjs - 如何仅导出 react-admin 列表中的选定项目?
- android - 如何捕获已在 Xamarin Forms (Android) DatePicker 上选择的默认日期?
- python - Matplotlib,限制图表中的条数
- google-chrome - 如何确定 Chrome 中的 cookie 问题?
- c# - 当应用程序在后台 Xamarin.Android 中时,无法第二次获得意图额外的文本
- sql - 在 postgresql 中有一组指令的函数中,查询没有结果数据的目的地
- ios - 如何定义具有动态缓冲区声明的金属着色器?
- php - 当我在 foreach 循环中(使用 post 方法)时无法访问输入的值
- android - ArrayList 在初始化后立即为空
- python - groupby + apply 导致一系列同时出现在索引和列中 - 如何防止它?