オーディオで発生した時間/場所のタイムスタンプを使用して、コピーされたテキストの各段落にタグを付けようとしています。
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
現在の場所を読み取ってログに追加するためにキーをバインドして、内部的にこれら2つのイベントをトリガーできます。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はこれらの無効なキーストロークを記録します)。たとえば、押された各キーは、10進数を表すように選択されます。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