一个文件中的多个并排视频流,无需转码

Posted

技术标签:

【中文标题】一个文件中的多个并排视频流,无需转码【英文标题】:Multiple side-to-side video streams in one file without transcoding 【发布时间】:2018-11-02 14:47:13 【问题描述】:

我正在研究一种可能性,即存储来自已在 h264 中编码的少数来源而无需视频转码的视频流,因为我想用于此项目的设备将无法即时转码组合视频。

我正在寻找的是两个或多个并排的图片(不是视频连接)打包到 mp4/avi/mkv 中。

我相信 mkv 容器支持这种包装,但我无法为 ffmpeg 或其他工具找到合适的选项来以这种方式存储它。它所做的是将非常慢的视频转码为一个大的 h264 流。

【问题讨论】:

MPEG 容器还支持在一个文件中包含多个具有不同属性的 TS(传输流)。但是恭喜你选择了 MKV,它更好更容易解析。 【参考方案1】:

如果您的播放器可以处理它,只需让它执行并排视图。无需编码或复用。

mpv 视频播放器

使用mpv的示例:

mpv --lavfi-complex="[vid1][vid2]hstack[vo];[aid1][aid2]amix[ao]" input1.mp4 --external-file=input2.mp4

上面的示例假设每个输入具有相同的高度。否则,您将不得不添加比例、scale2ref、填充和/或裁剪过滤器。使用裁剪过滤器从高度移除 20 个像素的简单示例:

mpv --lavfi-complex="[vid1]crop=iw:ih-20[c];[c][vid2]hstack[vo];[aid1][aid2]amix[ao]" input1.mp4 --external-file=input2.mp4

请参阅mpv documentation 和FFmpeg Filters 了解更多信息。

【讨论】:

【参考方案2】:

只需指定多个输入。

ffmpeg -i [input 1] -i [input 2] ... -map 0 -map 1 ... -codec copy -f matroska [output]

至于“侧对侧”部分,由玩家决定呈现方式。如果您不控制播放器并且需要特定的布局或演示,那么您必须将所有这些视频流“刻录”到一个新的视频流中,并将其编码为一个新的单个流。

【讨论】:

在这种情况下,您需要包含-map 选项来手动选择所需的流,例如-map 0 -map 1,因为default stream selection behavior 只会为每种流类型选择一个流。此外,-f 不是必需的(但如果需要,正确的值是 matroska,而不是 mkv)。 @LordNeckbeard 有效积分,谢谢。另外,我指定-f,因为我通常作为流输出到STDOUT。 -编解码器复制将第二个流附加到末尾,而不是强制 VLC 并行播放。 -map 不会改变行为。 @SergFilipenko 设置编解码器不会改变这样的任何事情。所有这一切都是将两个流放在同一个输出中。而且,它们应该是交错的。

以上是关于一个文件中的多个并排视频流,无需转码的主要内容,如果未能解决你的问题,请参考以下文章

JavaCV音视频开发宝典:无需流媒体服务也无需转码,使用JavaCV和springBoot实现http-flv转封装直播服务,浏览器网页flv.js直接播放rtprtsprtmp实时视频

JavaCV音视频开发宝典:无需流媒体服务也无需转码,使用JavaCV和springBoot实现http-flv转封装直播服务,浏览器网页flv.js直接播放rtprtsprtmp实时视频

JavaCV音视频开发宝典:无需流媒体服务也无需转码,使用JavaCV和springBoot实现http-flv转封装直播服务,浏览器网页flv.js直接播放rtprtsprtmp实时视频

将 2 个视频文件及其音频并排合并到一个文件中

并排播放两个视频:视频不显示

iOS 视频编辑 - 是不是可以使用 iOS 4 AVFoundation 类将两个视频文件合并(并排而不是一个接一个)为一个?