gstreamer - 如何合并来自不同来源的音频和视频以制作 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
这表明音频和视频时间戳相差太大,所以我想强制它们匹配,也许通过扔掉视频时间戳?
解决方案
“同步”有不同的含义。让我们暂时忽略口型同步(音频和视频相互匹配)。
在时间戳方面存在同步 - 例如,它们在表示中是否带有相似的时间戳。并根据这些带有时间戳的样本何时实时同步实际到达接收器(延迟)。
很难通过错误来判断水槽到底在抱怨哪个错误。
也许尝试x264enc tune=zerolatency
开始,因为没有该选项,编码器会产生两秒的延迟,这可能会导致某些要求出现问题。
然后音频流也会有一些延迟。调整这两者以匹配可能并不容易。接收器实际上应该进行缓冲和同步。
推荐阅读
- python - PyCharm 未将源根目录添加到“sys.path”
- ruby-on-rails - 匹配 mongodb 字段中的任何单词或单词的一部分
- arrays - 扫描镜像和旋转的二维阵列
- neo4j - 分布式模式下的 Neo4j - 有可能吗?
- angular - 动态更改角度材料 mat-grid-list 中的列值
- php - 在laravel上的每个循环中附加字符串
- azure-devops - 用于将发布管道中的 vsts 构建工件混淆为 VSTS 任务的容器
- android - 更新 Firebase 依赖项时出现 Gradle 构建错误
- swift - 无法将“Promise<[NSDictionary]>”类型的值转换为预期的参数类型“保证”
' - elasticsearch - 如何组合 multi_match 和两个布尔过滤器