我可以在 MPV 中播放后排和前排行车记录仪视频的播放列表吗?

我可以在 MPV 中播放后排和前排行车记录仪视频的播放列表吗?

我试图同时播放行车记录仪中的前后镜头作为mpv.

前后视频文件位于FR目录中。我可以轻松地将所有文件从 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”

看看行车记录仪如何存储文件,它应该涵盖大部分(如果不是全部)文件。请注意,叠加过滤器速度很慢,因此您可能需要尝试使用hstackvstack来代替(但是两个视频都需要具有相同的像素高度,这通常意味着您需要放大后视图以匹配前视图,例如[vid2]scale=1920x1080[big];[big][vid1]hstack[vo])。

相关内容