首页 > 解决方案 > 如何从多个流中连续加载同步视频?

问题描述

我有 3 个具有以下结构的独立视频流:

Bike
├── dash
│   ├── dash-1.mp4
│   ├── dash-2.mp4
│   ├── dash-3.mp4
│   └── dash-4.mp4
├── gopro
│   ├── gopro-1.mp4
│   ├── gopro-2.mp4
└── gps
    └── gps-1.mp4

每个流是一个视频文件列表,应该一个接一个地播放,即连续播放到列表的末尾。流总长度相等,每个文件按顺序播放,即一个gopro-1.mp4gopro-2.mp4一个播放的总长度与gps-1.mp4等相同。我想同步并同时播放叠加中的所有 3 个流。用例是同时播放来自自行车行车记录仪、头盔式 GoPro 和 GPS 的视频(最后一个流具有 alpha 通道,但没关系)。罪魁祸首是每个流中的单个文件的长度不同。我(到目前为止)在 shell 脚本中使用的 MPV API 可以轻松地将文件覆盖gps-1.mp4在上面gopro-1.mp4并将它们一起播放,但无法处理加载gopro-2.mp4gps-1.mp4还在玩,所以我需要一个不同的解决方案。

作为参考,一个 shellscript(在安装了 MPV 的 Windows 和 Linux 上运行)适用于 2 个流,其中两个流具有相同数量的视频并且视频具有相同的长度:

#!/bin/sh

cd ~/Videos/Bike/gopro

overlays='' 

for gopro in $(ls -tr); do
    gps=../gps/${gopro/gopro-/gps-} # for gopro-1 look for ../gps/gps-1 and so on
    Yres=$(ffprobe -v error -select_streams v:0 -show_entries stream=height -of csv=p=0 $gopro) # gopro video height
    Yres=$(($Yres/3)) # map will be 3rd of the gopro video height
    overlays+=" --{ $gopro --external-file=$gps --lavfi-complex=[vid2]scale=-1:$Yres[small];[vid1][small]overlay[vo] --}"
done

exec mpv $overlays "$@"

我考虑过实时修剪gps-1.mp4gps-1-1和,以便gps-1-2我可以叠加gps-1-1,但它似乎是 MPV API 的一个限制,即对视频进行分组(相当于 CLI 中的和)并修剪视频长度(在 CLI 中)可以'不能一起使用。因此,我决定切换到 Python 或 C++ 之类的东西,但我不知道如何处理这个任务。gopro-1gps-1-2gopro-2--{--}--start=$S --length=$L

Ps 有几个专用的行车记录仪播放器已经这样做了,但它们都不能在 Linux 上运行 - 理想情况下,该解决方案将独立于平台,例如我使用 MPV,因为它可以在许多平台上运行,但它不必是 MPV 或 shellscript/ C/Python。从字面上看,任何事情都会做。我当前的解决方案粘贴在上面只是为了帮助可视化问题。特定于 Windows 的 C++ 或 Python 解决方案很好,我很乐意让它在不同的平台上工作。我只是希望它不会因为个人原因而出现在 Java 中。

标签: pythonc++apivideompv

解决方案


推荐阅读