강의 녹음에 타임스탬프를 어떻게 추가하나요?

강의 녹음에 타임스탬프를 어떻게 추가하나요?

오디오에서 발생하는 시간/장소의 타임스탬프를 사용하여 복사된 텍스트의 각 단락에 태그를 지정하려고 합니다.

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현재 위치를 읽고 이를 로그에 추가하기 위해 키를 바인딩하여 내부적으로 이 두 이벤트를 트리거 할 수 있습니다 .emacspoint

예, 짐작하셨겠지만 질문이 있습니다. 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 명령은 조각으로 끝납니다.he

답변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

관련 정보