首页 > 解决方案 > 如何合并来自不同来源的音频和视频以制作 kinesis 视频

问题描述

如何以使它们在 gstreamer 中保持同步的方式将不相关的音频放入任何生成的视频流中?

语境:

我想将来自 icecast 的音频流式传输到 Kinesis Video 流中,然后使用 Amazon 的播放器进行查看。播放器只有在有视频和音频的情况下才能工作,所以我用 testvideosrc 生成视频。

视频和音频需要在时间戳方面保持同步,否则 Kinesis sink 'kvssink' 会引发错误。但是因为它们是两个独立的源,它们不在接收器中。

我正在使用 gst-launch-1.0 来运行我的管道。

我的基本尝试是这样的:

gst-launch-1.0 -v \
    videotestsrc pattern=red ! video/x-raw,framerate=25/1 ! videoconvert ! x264enc ! h264parse ! video/x-h264,stream-format=avc,alignment=au !  \
    queue ! kvssink name=sink stream-name="NAME" access-key="KEY" secret-key="S_KEY" \
    uridecodebin uri=http://ice-the.musicradio.com/LBCLondon ! audioconvert ! voaacenc ! aacparse ! queue ! sink.

我收到的错误消息转换为:STATUS_MAX_FRAME_TIMESTAMP_DELTA_BETWEEN_TRACKS_EXCEEDED

这表明音频和视频时间戳相差太大,所以我想强制它们匹配,也许通过扔掉视频时间戳?

标签: gstreameramazon-kinesisgstreamer-1.0

解决方案


“同步”有不同的含义。让我们暂时忽略口型同步(音频和视频相互匹配)。

在时间戳方面存在同步 - 例如,它们在表示中是否带有相似的时间戳。并根据这些带有时间戳的样本何时实时同步实际到达接收器(延迟)。

很难通过错误来判断水槽到底在抱怨哪个错误。

也许尝试x264enc tune=zerolatency开始,因为没有该选项,编码器会产生两秒的延迟,这可能会导致某些要求出现问题。

然后音频流也会有一些延迟。调整这两者以匹配可能并不容易。接收器实际上应该进行缓冲和同步。


推荐阅读