我试图同时播放行车记录仪中的前后镜头作为mpv
.
前后视频文件位于F
和R
目录中。我可以轻松地将所有文件从 egF
目录添加到播放列表:
mpv F/*
我还可以为一对前/后镜头运行画中画叠加:
mpv $front_video --external-file=$rear_video --lavfi-complex='[vid2] scale=640x360 [small]; [vid1] [small] overlay [vo]'
我在组合两者时遇到困难,即我想要一个画中画叠加的播放列表。问题是我总是从第一个视频中获得后视图:
mpv \
REC_200607-175943F.MOV --external-file=../R/REC_200607-175943R.MOV --lavfi-complex='[vid2] scale=640x360 [small]; [vid1] [small] overlay [vo]' \
GSR_200607-180444F.MOV --external-file=../R/GSR_200607-180444R.MOV --lavfi-complex='[vid2] scale=640x360 [small]; [vid1] [small] overlay [vo]' \
GSR_200607-180943F.MOV --external-file=../R/GSR_200607-180943R.MOV --lavfi-complex='[vid2] scale=640x360 [small]; [vid1] [small] overlay [vo]'
目前,我正在使用一个脚本,该脚本mpv
在第一个视频退出后立即运行下一对视频,这样我就可以从头到尾观看所有视频,但我错过了诸如跳到上一个/下一个视频、检查位置等功能我的播放列表,设置播放速度、音量、对比度等。此外,在播放过程中停止很麻烦,因为退出一个mpv
实例会运行下一个实例:
#!/bin/sh
for front in $(ls -tr); do
rear=../R/${front/F./R.}
mpv $front --external-file=$rear --lavfi-complex='[vid2] scale=640x360 [small]; [vid1] [small] overlay [vo]'
done
有什么建议么?
答案1
我对你感激不尽。我正在制作一个视频比较工具,并使用 Python 来完成该任务。这是相同 bash 代码的 Python 实现,供需要的人使用!
我用了Windows 10 和 Python 2.7但在 Linux 上应该是类似的:
# python 2.7, windows 10, test mpv
import os
import sys
import subprocess
RUNTIME_CWD = os.path.dirname(__file__)
MPV_EXE_PATH = [os.path.join(RUNTIME_CWD,"mpv","mpv.exe")] # the python script is located one dir above the mpv directory
FRONT_playlist = ['C:\\Users\\PC\\Videos\\test\\test_front1.mp4', 'C:\\Users\\PC\\Videos\\test\\test_front2.mp4']
REAR_playlist = ['C:\\Users\\PC\\Videos\\test\\test_rear1.mp4', 'C:\\Users\\PC\\Videos\\test\\test_rear2.mp4']
videos=""
# supressed the terminal output using, --no-terminal
for REAR_playlist, FRONT_playlist in zip(REAR_playlist,FRONT_playlist):
# picture in picture
videos += " --{{ {0} --no-terminal --external-file={1} --lavfi-complex=[vid2]scale=640x360[small];[vid1][small]overlay[vo] --}}".format(REAR_playlist, FRONT_playlist)
# top bottom
# videos += " --{{ {0} --no-terminal --external-file={1} --lavfi-complex=[vid2]scale=1920x1080[big];[big][vid1]vstack[vo] --}}".format(REAR_playlist,FRONT_playlist)
# side to side
# videos += " --{{ {0} --no-terminal --external-file={1} --lavfi-complex=[vid2]scale=1920x1080[big];[big][vid1]hstack[vo] --}}".format(REAR_playlist,FRONT_playlist)
subprocess.call([MPV_EXE_PATH[0]] + videos.split() + sys.argv[1:])
答案2
有一部分是MPV 文档这与过滤器和播放列表均无关,但描述了允许准确满足需要的选项的使用--{
和分组选项。--}
在下面的播放列表中运行覆盖的工作脚本。将其保存在文件中,使其可执行(chmod u+x file_name
),如果您的行车记录仪具有与我的相同的命名约定,请在F
目录中运行它:
#!/bin/sh
videos=''
for front in $(ls -tr); do
rear=../R/${front/F./R.}
videos+=" --{ $front --external-file=$rear --lavfi-complex=[vid2]scale=640x360[small];[vid1][small]overlay[vo] --}"
done
exec mpv $videos "$@"
vid1, vid2, ... vidN
- 视频输入vo
- 视频输出,又称最终结果[vid2]scale=640x360[small]
- 拍摄“vid2”(第一个外部视频),缩放它,另存为“小”[vid1][small]overlay[vo]
- 将“vid1”和“small”重叠,另存为“vo”
看看行车记录仪如何存储文件,它应该涵盖大部分(如果不是全部)文件。请注意,叠加过滤器速度很慢,因此您可能需要尝试使用hstack
或vstack
来代替(但是两个视频都需要具有相同的像素高度,这通常意味着您需要放大后视图以匹配前视图,例如[vid2]scale=1920x1080[big];[big][vid1]hstack[vo]
)。