javascript - 有没有办法使用 h.264 编解码器恢复实时 h264 播放(客户端重新加入)?

标签 javascript ffmpeg h.264 media-source

目前,我在使用 MediaSource API 恢复实时 h264 播放时遇到了一些问题。
我的服务器端代码将保留来自 FFmpeg 的第一个数据包,然后将其分派(dispatch)给客户端。但是,这很好用,但会引发一个问题。
当我重新启动流并将其分派(dispatch)给客户端时,它会按预期进行,这是我期望客户端断开连接然后必须重新连接到流时的结果,是前面提到的 result
但是,如果我要重新加入流,我会得到 result
此外,上图中的 FFMpeg 数据正在发送到客户端,只是由于某种原因没有渲染它。
这是我播放从服务器获得的音频/视频帧的功能。

private _playFrame(type: 0 | 1) {
    const src = type === 0 ? this.audioSource : this.videoSource;
    if (!src || src.updating) return;
    const queue = type === 0 ? this.audioFrameQueue : this.videoFrameQueue;
    src.appendBuffer(queue.shift());
    if (this.video.src && this.video.paused) this.video.play().then(() => null);
}

最佳答案

分段的 .mp4 数据流(用于实时播放的类型)在压缩媒体本身之前有一个描述其媒体的序言。
包含媒体元数据的序言是一个数据 block ——在 mp4 的行话中是一个“原子”——命名为 'moov'。 .它的一个亚原子,'avcC' ,包含用于 H.264 视频流的所谓编解码器专用数据。如果您要求解码器处理 H.264 而不向其提供编解码器专用数据,则它无法解释 H.264 并因此跳过它。任何解码器都是如此,包括嵌入在浏览器或桌面媒体播放器包中的解码器。'moov'序言可能在 ffmpeg 的第一个数据包中(尽管您需要使用 tool like mp4dump 来检查该数据以确保)。
因此,要加入直播流,观众必须先接收序幕数据,然后再接收直播数据。

关于javascript - 有没有办法使用 h.264 编解码器恢复实时 h264 播放(客户端重新加入)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66310050/

相关文章:

c++ - ffmpeg 创建 RTP 流

opengl - 如何在不复制到 CPU 内存的情况下将 ffmpeg 纹理转换为 Open GL 纹理

javascript - 将类添加到包含 Dog 1 及其之间的行的 div

javascript - 对象内部的数组未正确删除

javascript - Video.js this.tech 未定义 firefox

iPhone - 使用 ffmpeg 解码 H264 的问题

ios - MP4 视频在桌面上工作,而不是在移动设备上

javascript - NativeBase 按钮​​不显示文本

python - OpenCV VideoCapture 无法从流中读取

ffmpeg - 使用 FFmpeg 的 libavformat API 通过直接流复制创建的文件以 3600 fps 播放速度太快