목록에 있는 각 비디오의 시작 및 중지 시간이 서로 다른 재생 목록(비디오 파일용)을 만들고 편집할 수 있는 Linux용 GUI 응용 프로그램(예: mplayer GUI 또는 banshee 등)이 있습니까?
다음에 추가:
현재 나는 다음과 같은 내용을 포함하는 파일을 수동으로 만듭니다.
video.avi -ss 2440 -endpos 210
#some comment
video2.mp4 -ss 112 -endpos 2112
그런 다음 래퍼 스크립트가 있습니다.mplayer -fs $(grep -v "^ #" $1)
추가적으로, 나는 그러한 파일을 약간 더 쉽게 편집할 수 있게 해주는 몇 가지 emacs 기능을 작성했습니다. (-endpos에서 요구하는 대로 시작 및 종료 시간을 hh:mm:ss 형식에서 초로, 종료 시간을 상대 위치(종료 시간 - 시작 시간)로 변환하는 것과 같습니다(관심 있는 사람이 있으면 매크로를 게시할 수 있습니다). 그러나 이는 여전히 너무 불편해서 이 작업을 수행할 수 있는 좋은 GUI가 있는지 질문이 있습니다(예: 비디오 타임라인에서 재생 목록의 시작 및 종료 시간을 표시할 수 있는 등).
답변1
영어가 모국어가 아니어서 잘못된 질문을 하는 것일 수도 있겠지만, 이런 도구로 영상을 편집하면 더 좋지 않을까요?치노이런 재생목록을 만드는 대신?
필요에 따라 시작 시간과 종료 시간을 조정할 수 있는데, 그렇게 어렵지는 않을 것 같아요.
답변2
업데이트-2: 다음 스크립트를 제출한 후 GUI에서 시간 위치를 설정하는 또 다른 방법은 자막 편집기(예: gnome-subtitles
)를 사용하는 것임을 갑자기 깨달았습니다. 한 번의 클릭으로 "유령 자막"이 시작하고 끝나는 위치를 표시할 수 있습니다. 실제로 파일 경로와 설명을 "자막"으로 전달할 수 있습니다... 일부 형식은 적합하지 않습니다(예: 프레임 번호 사용).. "ViPlay 자막 " 파일, Power DivX 및 Adobe Encore DVD가 좋아 보입니다.
업데이트-1; 새로운 스크립트... 이 스크립트는 통합 재생 목록 기능을 제공하지 않지만 아무것도 입력하지 않고도 Smplayer에서 시작 및 종료 시간을 선택, 저장 및 수정할 수 있습니다.
이 정보는 파일 경로가 개별적으로 "재생"되거나 다른 스크립트(내 "재생" 스크립트 또는 Emacs 스크립트와 유사)에 의해 순차적으로 그룹화될 수 있는 구성 파일에 저장됩니다.
작동 방법은 Smplayer의 Seek
대화 상자를 활용하는 것입니다... xmacro
대화 상자를 조작하는 것입니다(xmacro 명령 사이에 있어야 한다는 것을 알았습니다 sleep .3
)... 시간은 HH:MM:SS 형식으로 파일에 저장됩니다 ~/.config/smplayer
. 첫 번째 줄은 시작 시간, 두 번째 줄은 종료 시간, 세 번째 줄은 루트 디렉터리를 지정하는 데 사용됩니다... 세 번째 줄은 시작하여 smplayer 구성 설정을 수정하는 후속 스크립트에 의해 선택적 경로 표시기로 사용됩니다. -ss
와-endpos
... 타임스탬프 프로필은 미디어 파일과 동일하게 이름이 지정되며 접미사는 .smplay
...
그래서 원하는 것이 전부는 아니지만, 타이핑 없이 시간만 맞추면 도움이 될 수도 있겠네요...
다음은 "타임스탬프 가져오기" 스크립트입니다.
#!/bin/bash
# Bind this script to a key-combination of your choice..
# It currently responds only to an Smplayer window.
id=$(xdotool getactivewindow)
title="$(xwininfo -id "$id" |
sed -n "2s/^xwininfo: Window id: \(0x[[:xdigit:]]\+\) \x22\(.*\)\x22$/\2/p")"
if [[ $title =~ ^.*\ -\ SMPlayer$ ]] ; then
smplayer_d="$HOME/.config/smplayer"
clip_d="$smplayer_d/clips"
[[ ! -d "$clip_d" ]] && mkdir -p "$clip_d"
bname="${title% - SMPlayer}"
clip_f="$clip_d/$bname.smplay" # Same name as video, with '.smplay' suffix
if [[ ! -f "$clip_f" \
|| "$(<"$clip_f" wc -l)" != "3" ]]
then # Prime with three defaults
# FROM TO ROOT-dir
echo -e "0:00:00\n0:00:00\n" >"$clip_f"
fi
# Get timestamp, in seconds, of current stream position (from the current window)
# using the "Smplayer - seek" dialog, via Ctrl+j
sleep .3; echo -n "KeyStrPress Control_L KeyStrPress j KeyStrRelease j KeyStrRelease Control_L" | xmacroplay -d 10 :0.0 &>/dev/null
sleep .3; echo -n " KeyStrPress Home KeyStrRelease Home " | xmacroplay -d 10 :0.0 &>/dev/null
sleep .3; echo -n "KeyStrPress Shift_L KeyStrPress End KeyStrRelease End KeyStrRelease Shift_L " | xmacroplay -d 10 :0.0 &>/dev/null
sleep .3; echo -n "KeyStrPress Control_L KeyStrPress c KeyStrRelease c KeyStrRelease Control_L" | xmacroplay -d 10 :0.0 &>/dev/null
sleep .3; echo -n " KeyStrPress Escape KeyStrRelease Escape " | xmacroplay -d 10 :0.0 &>/dev/null
seekHMS="$(xsel -o -b)"
# Now set config times to defaults (in case of malformed times)
ssHMS="0:00:00"
endposHMS="0:00:00"
# Now get config data from config file
eval "$( sed -ne "1s/^\([0-9]\+\):\([0-5][0-9]\):\([0-5][0-9]\)$/ ssHMS=\"&\"/p" \
-e "2s/^\([0-9]\+\):\([0-5][0-9]\):\([0-5][0-9]\)$/endposHMS=\"&\"/p" \
-e "3s/.*/ root_d=\"&\"/p" "$clip_f" )"
# Present dialog to set specifick items.
REPLY=$(zenity \
--list --height=310 --width=375 \
--title="Set Clip Start / End Time" \
--text=" Select Clip Start / End for time: $seekHMS\n\
or choose another option\n\
\tthen click OK" \
--column="Position" --column=" " --column="Current Setting " \
"Clip Start" " " "$ssHMS" \
"Clip End" " " "$endposHMS" \
"UNSET Start" " " " " \
"UNSET End" " " " " \
"* Open directory" " of" "config files *"
);
[[ "$REPLY" == "Clip Start" ]] && sed -i -e "1 s/.*/$seekHMS/" "$clip_f"
[[ "$REPLY" == "Clip End" ]] && sed -i -e "2 s/.*/$seekHMS/" "$clip_f"
[[ "$REPLY" == "UNSET Start" ]] && sed -i -e "1 s/.*/0:00:00/" "$clip_f"
[[ "$REPLY" == "UNSET End" ]] && sed -i -e "2 s/.*/0:00:00/" "$clip_f"
[[ "$REPLY" == "* Open directory" ]] && nautilus "$clip_d"
fi
다음 스크립트는 내 원래 "재생" 스크립트입니다. 이는 위의 Timestamp 스크립트와 독립적이지만 함께 작동하는 데 많은 시간이 걸리지 않습니다.
내부적으로 mplayer를 사용하는 Smplayer를 "구동"합니다. 최소한 일반적인 GUI이지만 재생 목록은 텍스트 편집기에 있어야 합니다. 그리고 분명히 방법을 이미 알고 있습니다 :)
나는 이것을 몇 년 전에 시도했지만 이와 같은 것이 자주 필요하지 않기 때문에 잊어버렸습니다. 그러나 "북마크"를 유지하는 것이 좋습니다... 이 아이디어를 되살려주셔서 기쁩니다. 스크립트는 다음과 같습니다... 실제로는 여러분이 했던 것과 동일한 작업을 수행하지만 Smplayer(mplayer GUI)에 대한 것입니다.
#
# Summary:
# Play one video (only) in 'smplayer', passing -ss and -endpos values to 'mplayer'
# It uses 'locate' to get the path of the video (by just its basename)
#
# eg:
# $1 $2 $3 $4
# basename -ss -endpos root
# "Titus - The Gorilla King.mp4" 240 30 "$HOME" # A fascinating documentary of the long reign of a silver-back gorialla
#
[[ "$2" == "" ]] && set "$1" 0 "$3" "$4"
[[ "$3" == "" ]] && set "$1" "$2" 36000 "$4" # 36000 is arbitary (24 hours)
[[ "$4" == "" ]] && root="$HOME" || root="$4"
file=( "$(locate -er "^$root/\(.*/\)*\+$1$")" )
# 1) Tweak 'smplayer.ini' to run 'mplayer' with the specified -ss and -endpos times
# 2) Run 'smplayer' to play one video only. The time settings will hold afer exit,
# so the script waits (backgrounded) for smplayer to exit
# 3) When 'smplayer' exits, set values to extreme limits: -ss 0 -endpos 3600
# or(?): TODO remove the settings enitrely,
# but that requires a different regex
a=0 z=36000
#
# -ss <time> (also see -sb)
# -ss 56 # Seeks to 56 seconds.
# -ss 01:10:00 #Seeks to 1 hour 10 min.
#
# -endpos <[[hh:]mm:]ss[.ms]|size[b|kb|mb]> (also see -ss and -sb)
# Stop at given time or byte position.
# NOTE: Byte position is enabled only for MEncoder and will not be accurate, as it can only stop at a frame boundary.
# When used in conjunction with -ss option, -endpos time will shift forward by seconds specified with -ss.
# -endpos 56 # Stop at 56 seconds.
# -endpos 01:10:00 # Stop at 1 hour 10 minutes.
# -ss 10 -endpos 56 # Stop at 1 minute 6 seconds.
# -endpos 100mb # Encode only 100 MB.
#
# -ss 0 -endpos 36000
# \1 \2 \3 \4 \5 \6 \7 \8
sed -i -e "s/^\(mplayer_additional_options.*\)\( \|=\)\(-ss \+\)\([^ ]\+\)\( .*\)\(-endpos \+\)\([0-9:mb]\+\)\(.*\)/\1\2\3${2}\5\6${3}\8/" $HOME/.config/smplayer/smplayer.ini
(smplayer "$file"
sed -i -e "s/^\(mplayer_additional_options.*\)\( \|=\)\(-ss \+\)\([^ ]\+\)\( .*\)\(-endpos \+\)\([0-9:mb]\+\)\(.*\)/\1\2\3${a}\5\6${z}\8/" $HOME/.config/smplayer/smplayer.ini
)
exit
답변3
두 번째 답변을 추가했습니다.일반 재생목록처럼 작동합니다.SMPlayer에서는 명확성을 위해 여기가 더 좋습니다...
재생목록을 통해 완벽하게 작동하게 되었습니다...
이 방법은 SMPlayer 재컴파일과 특정 파일 명명 방법이 필요합니다. SMPlayer 소스 코드에서 함수 하나만 수정하고, 동일한 소스 파일에 헤더 파일 3개를 추가했습니다. smplayer_0.6.8
Maveric과 Lucid에서 사용하는 것으로 컴파일했습니다. 미어캣 smplayer_0.6.9
.. 이후 버전에서는 한 줄이 다르지만 별 영향은 없습니다... 수정된 함수와 헤더는 다음과 같습니다.smplayer_0.6.8
그런데 이전 답변의 zenity 대화 상자를 사용하여 시작 및 종료 시간을 캡처할 수 있습니다...
상기시키다- 다음 소스 세그먼트는 다음과 같습니다 smplayer_0.6.8
. 수정할 파일은 다음과 같습니다. ../smplayer-0.6.9/src/findsubtitles/osparser.cpp
..."0.6.8"과 "0.6.9"의 새 세그먼트는 동일하지만 원본 세그먼트는 한 줄씩 다릅니다(매우 가깝습니다). 끝까지; 결승전 직전 return hexhash;
)
#include
기존 제목 바로 아래에 첫 번째 줄 블록을 추가합니다.
// ====================
// fred mod begin block
#include <QFileInfo>
#include <QRegExp>
#include <QSettings>
#include "paths.h"
// fred mod end block
// ==================
수정된 기능입니다
QString OSParser::calculateHash(QString filename) {
QFile file(filename);
if (!file.exists()) {
qWarning("OSParser:calculateHash: error hashing file. File doesn't exist.");
return QString();
}
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
in.setByteOrder(QDataStream::LittleEndian);
quint64 size=file.size ();
quint64 hash=size;
quint64 a;
for(int i = 0; i < 8192; i++) {
in >> a ; hash += a;
};
file.seek(size-65536);
for(int i = 0; i < 8192; i++) {
in >> a ; hash += a;
};
// =====================================================================
// fred mod begin block
//
// A mod to enable unique smplayer .ini files to be created for
// content-identical media files whose file-names match
// a specific pattern based on two timestamps.
// This is the naming pattern:
//
// name.[00:11:22].[33.44.55].mkv
//
// The two time stamps indicate the start and end points of a
// clip to be played according to settings in the unique .ini
//
// The so named files can be, and typically will be, soft (or hard) links.
// The "original" file can also named in this manner, if you like,
// but that would make the "original" start playing as a clip,
// NOTE: soft links become invalid when you rename the original file.
//
// Note: For this system to work, you need to enable the following:
// In SMPlayer's GUI, open the Options dialog...
// In the "General" tab... "Media settings"...
// enable: 〼 "Remember settings for all files (audio track, subtitles...)"
// "Remember time position" can be 'on' or 'off'; it is optional1
// but it is disabled for these clips.
// "Store setings in" must be: "multiple ini files"
//
QFileInfo fi(filename);
QString name = fi.fileName();
//
// ===================================================================
// This RegExp expects a name-part,
// followed by 2 .[timestamps] (Begin-time and End-time)
// followed by a .extension
//
// .[ Begin ].[ End ]
// eg. name.[00:11:22].[33.44.55].mkv
//
// Note: The delimiter between each numeric value can be any non-numeric character.
// The leading dot '.' and square brackets '[]' must be as shown
// HH, MM, and SS must each be 2 valid time-digits
//
QRegExp rx("^.+" // NAME
"\\.\\[([0-9][0-9])[^0-9]" // .[HH.
"([0-5][0-9])[^0-9]" // mm.
"([0-5][0-9])\\]" // ss]
"\\.\\[([0-9][0-9])[^0-9]" // .[HH.
"([0-5][0-9])[^0-9]" // mm.
"([0-5][0-9])\\]" // ss]
"\\.([^0-9]+)$"); // .EXTN
//
QString qstrIni;
rx.setPatternSyntax(QRegExp::RegExp);
if(rx.exactMatch(name)) {
bool ok;
QString qstrDlm(".");
QString qstrBegEnd = rx.cap(1) + rx.cap(2) + rx.cap(3)
+ rx.cap(4) + rx.cap(5) + rx.cap(6);
hash += qstrBegEnd.toLongLong(&ok,10); // The UNIQUE-FIER
//
quint32 quiBegSec=(rx.cap(1).toULong(&ok,10)*3600)
+(rx.cap(2).toULong(&ok,10)* 60)
+(rx.cap(3).toULong(&ok,10));
quint32 quiEndSec=(rx.cap(4).toULong(&ok,10)*3600)
+(rx.cap(5).toULong(&ok,10)* 60)
+(rx.cap(6).toULong(&ok,10));
quint32 quiDifSec=(quiEndSec-quiBegSec);
//
QString qstrBegIni = "-ss " + QString::number(quiBegSec);
QString qstrEndIni = "-endpos " + QString::number(quiDifSec);
qstrIni = qstrBegIni + " " + qstrEndIni;
}
// fred mod end block
// =====================================================================
// fred NOTE: the following 2 lines are a single line in smplayer-0.6.9
QString hexhash("");
hexhash.setNum(hash,16);
// =====================================================================
// fred mod begin block
if( !qstrIni.isEmpty() ) {
// ** The next code line is not ideal, but should be okay so long
// as SMPlayer's options are set to use Multiple .ini files.
// The literal "file_settings" is HARDCODED, as It wasnt' straight
// forward to get the value, The rest of the path was easily available
// without any significant mods, which "file_settings" would require.
// TODO: Check for Multiple .ini Option being enabled.
//
QString dir_settings = Paths::configPath() + "/file_settings";
QString fqfn_settings = dir_settings + "/" + hexhash[0] + "/" + hexhash + ".ini";
QSettings set(fqfn_settings, QSettings::IniFormat);
set.beginGroup("file_settings");
set.setValue( "starting_time", "0" );
set.setValue( "mplayer_additional_options", qstrIni );
}
// fred mod end block
// =====================================================================
return hexhash;
}
답변4
실제로 재생목록에 적용할 수 있는지는 확인하지 못했지만 편집 결정 목록(EDL)을 확인하실 수 있습니다. 시작하는 데 도움이 되는 몇 가지 링크는 다음과 같습니다.
명령줄에서 비디오 편집Linux Gazette 기사
비디오 사이에 약간의 일시 정지가 있어도 괜찮다면 매번 다른 EDL 파일을 사용하여 스크립트에서 mplayer를 몇 번 실행할 수 있습니다. 일시 중지가 안 되는 경우에는 varrtto가 제안한 것과 같은 새 비디오를 만들어야 할 수도 있습니다.