오디오에서 발생하는 시간/장소의 타임스탬프를 사용하여 복사된 텍스트의 각 단락에 태그를 지정하려고 합니다.
mplayer
그리고 emacs
나를 가까이 두십시오. mplayer
, 예를 들어 터미널에서 적절한 시간 정보 문자열을 출력합니다. (명령 및 예제 로그)
mplayer au-file 1>event.log 2>&1
A: 0.8 (00.7) of 3207.0 (53:27.0) 0.1% [J
A: 0.9 (00.9) of 3207.0 (53:27.0) 0.1% [J
A: 1.0 (01.0) of 3207.0 (53:27.0) 0.1% [J
특정 언바운드 키(예: F12
)를 사용하여 로그의 이벤트, 특히 단락의 시작 부분을 표시할 수 있습니다.
xdotool key --window $termID F12
A: 3.1 (03.0) of 3207.0 (53:27.0) 0.1% [J
No bind found for key 'F12'.
A: 3.2 (03.2) of 3207.0 (53:27.0) 0.1% [J
A: 3.3 (03.3) of 3207.0 (53:27.0) 0.1% [J
위의 내용은 훌륭하게 작동합니다. 다음으로 필요한 것은 주입할 라인 번호입니다 event.log
. emacs
현재 위치를 읽고 이를 로그에 추가하기 위해 키를 바인딩하여 내부적으로 이 두 이벤트를 트리거 할 수 있습니다 .emacs
point
예, 짐작하셨겠지만 질문이 있습니다. mplayer
다음 줄을 쓸 때 내가 추가한 텍스트를 덮어쓰기 때문에 스트림 포인터(또는 뭔가?)가 유지되는 것 같습니다 . 무슨 일이 일어나고 있는지 모르겠지만 내가 추가한 줄 중 최종 로그에는 아무것도 나타나지 않습니다 echo $number >>events.log
. .
로그를 봤는데 tail -f events.log
가끔 줄이 나오는 걸 보니 거기까지 갔나 봐요...
이 문제를 해결할 방법이 있나요?
일부 fu
로그를 통하거나 완전히 다른 접근 방식을 사용합니다. 일부 도구는 이 작업을 실시간으로 수행할 수 있습니다. 자막 도구와 오디오 비디오 편집기를 살펴봤지만 너무 투박해 보였습니다. 나는 어떤 아이디어라도 열려 있습니다.
답변1
실제로 mplayer
파일에 자신의 포인터를 유지하므로 echo
파일에 쓸 때 이를 알지 못합니다. 파일에 여러 프로그램을 쓰는 경우 모든 프로그램이 파일을 열도록 예약하십시오.추가 모드. 추가 모드에서는 각 쓰기가 파일 끝에서 발생합니다. 쉘로 판단하면 >>
. : >events.log
다시 시작하려면 빈 파일을 만들고 mplayer … >>events.log
.
이는 두 프로그램의 모든 바이트가 파일에 표시된다는 것을 보장하지만 원칙적으로 흩어지지 않는다는 것을 보장하지는 않습니다. 이론적으로는 일부 mplayer 출력이 파일에 표시될 echo hello >>events.log
수 있습니다 . 실제로 대부분의 시스템에서 최대 512바이트를 인쇄하는 echo 명령은 조각으로 끝납니다.h
e
답변2
노트. 내 질문에 대한 답변은 다음과 같습니다.
다음 방법은 매우 효과적입니다. 이는 바인딩되지 않은 일련의 키 입력을 mplayer로 보냅니다(mplayer는 이러한 잘못된 키 입력을 기록합니다). 예를 들어, 누른 각 키는 십진수를 나타내도록 선택됩니다. F2 F5 F7
표시된 10진수를 전송합니다 257
. 6자리를 전송하는데 약 0.2초가 소요됩니다. 타임스탬프는 첫 번째 (제목) 키를 누르기 전의 로그 줄에서 가져옵니다. 이렇게 하면 에 설명된 대로 캐시 대기 시간과 관련된 모든 문제를 피할 수 있습니다.자일스의답변.
emacs
커서를 다른 줄로 이동하거나 특정 키를 누르는 것만 으로도 point
매우 쉽게 실행할 수 있습니다 (코드는 여기에 없지만 충분히 간단하기를 바랍니다(저는 elisp를 처음 사용합니다)). 다음은 코딩되고 알파 테스트된 솔루션입니다.
# Insert a number (input to this script) into mplayer's log;
# Each digit of the input number is translated into
# a key-press for which mplayer does not have a binding.
# mplayer makes a log entry for each invalid key-press.
# The log entry identifies the key, so the entry can be
# translated back into its original decimal value
#
# A leading and a trailing marker are also sent to mplayer
#
# A simple parsing of the log can rebuild the original
# number and the time within the media stream when it occurred.
#
num=${1:-123456} # Default if for testing only
shopt -s extglob # For splitting the input number
# Window ID ($2) Defaults to win whose title == $USER@$HOSTNAME.*
win=${2:-$(($(wmctrl -l | sed -nr "s/^([^ ]+).* $USER@$HOSTNAME.*/\1/p")))}
# ========== ===== === # Key-press translation array
# 0123456789 begin end # decimal digits and delimiters
key=(F12 F{1..9} c \') # key names
# ========== ===== === #
xdotool key --window $win ${key[10]} # HEAD Marker
for i in ${num//?(.)/ } ;do
xdotool key --window $win ${key[i]} # Encoded decimal digit
done
xdotool type --window $win ${key[11]} # TAIL Marker
타임스탬프와 숫자(소스 텍스트의 줄 번호 또는 바이트/문자 오프셋)를 추출하는 3단계 후속 프로세스는 다음과 같습니다.
# (1) Each line of mplayer's normal output (vs errors) ends
# witn `\x1B\[J\x0D`. First, convertd this to `\n`
sed -nr 's/\x1B\[J\x0D/\n/gp' mplayer.log >/dev/null
# (2) The above pre-processing step(1) can be piped to the next sed step,
# but I've redirected it to /dev/nul for this example
# The following step works with a few lines of the pre-processed log
nbfk="No bind found for key"
sed -nr "
/^$nbfk 'c'\./,/^$nbfk '''\./{
/^$nbfk 'c'\./{g # HEAD Marker found
s/^A: *([0-9.]+).*/000000\1/
s/^0*([0-9]{6}\..*)/T:\1/p
}
s/^$nbfk 'F12'\..*/0/p # Digit
s/^$nbfk 'F([1-9])'\..*/\1/p # Digit
s/^$nbfk '''\..*/--/p # TAIL Marker found
}
h" <<'EOF'
A: 18.6 (18.6) of 3207.0 (53:27.0) 0.1%
A: 18.7 (18.6) of 3207.0 (53:27.0) 0.1%
No bind found for key 'c'.
A: 18.7 (18.6) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F1'.
A: 18.7 (18.7) of 3207.0 (53:27.0) 1.0%
No bind found for key 'F2'.
A: 18.7 (18.7) of 3207.0 (53:27.0) 0.1%
A: 18.8 (18.7) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F3'.
A: 18.8 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F4'.
A: 18.8 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F5'.
A: 18.9 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F6'.
A: 18.9 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key '''.
A: 18.9 (18.9) of 3207.0 (53:27.0) 0.1%
A: 19.0 (18.9) of 3207.0 (53:27.0) 0.1%
EOF
# (3) The above step(2) can be piped to the next sed step,
# but I've let it go to stdout for this example
# The following example step works with output of step (2)
sed -nr "
/^T:[0-9.]+$/,/^--$/{
/^T:[0-9.]+$/{ s/^T:(.*)/\1 /; h}
/^[0-9]$/H
/^--$/{g; s/\n//g; p}
}" <<'EOF'
T:000018.7
1
2
3
4
5
6
--
EOF
이것이 최종 출력입니다. time in seconds
그리고 테스트합니다.line number
000018.7 123456