Można najpierw użyć ffmpeg do wykrywania przerw ciszy, jak to
ffmpeg -i "input.mov" -af silencedetect=noise=-30dB:d=0.5 -f null - 2> vol.txt
To będzie produkować wyjścia konsoli z odczytów, które wyglądają tak:
[silencedetect @ 00000000004b02c0] silence_start: -0.0306667
[silencedetect @ 00000000004b02c0] silence_end: 1.42767 | silence_duration: 1.45833
[silencedetect @ 00000000004b02c0] silence_start: 2.21583
[silencedetect @ 00000000004b02c0] silence_end: 2.7585 | silence_duration: 0.542667
[silencedetect @ 00000000004b02c0] silence_start: 3.1315
[silencedetect @ 00000000004b02c0] silence_end: 5.21833 | silence_duration: 2.08683
[silencedetect @ 00000000004b02c0] silence_start: 5.3895
[silencedetect @ 00000000004b02c0] silence_end: 7.84883 | silence_duration: 2.45933
[silencedetect @ 00000000004b02c0] silence_start: 8.05117
[silencedetect @ 00000000004b02c0] silence_end: 10.0953 | silence_duration: 2.04417
[silencedetect @ 00000000004b02c0] silence_start: 10.4798
[silencedetect @ 00000000004b02c0] silence_end: 12.4387 | silence_duration: 1.95883
[silencedetect @ 00000000004b02c0] silence_start: 12.6837
[silencedetect @ 00000000004b02c0] silence_end: 14.5572 | silence_duration: 1.8735
[silencedetect @ 00000000004b02c0] silence_start: 14.9843
[silencedetect @ 00000000004b02c0] silence_end: 16.5165 | silence_duration: 1.53217
Następnie generuje polecenia, aby podzielić z każda cisza kończy się kolejnym rozpoczęciem ciszy. Prawdopodobnie będzie chciał dodać jakieś uchwyty, powiedzmy, 250 ms, więc
ffmpeg -ss <silence_end - 0.25> -t <next_silence_start - silence_end + 0.25> -i input.mov word-N.mov
(I odpuściliśmy określający parametry audio/wideo)
będziemy chcieli napisać skrypt do skrobania dziennik konsoli i wygenerować plik strukturyzowany (może CSV) z kodami czasowymi - jedna para w każdej linii: silence_end i next silence_start. A następnie kolejny skrypt do generowania poleceń z każdą parą liczb.
Jako oneliner: 'ffmpeg -i input.mkv -filter_complex" [0: a] silencedetect = n = -90dB: d = 0.3 [outa] "-map [outa] -f s16le -y/dev/null | & F = '- aq 70 -v ostrzeżenie "perl -ne" INIT {$ ss = 0; $ se = 0; } if (/ silence_start: (\ S +) /) {$ ss = $ 1; $ ctr + = 1; printf "ffmpeg -nostdin -i input.mkv -ss% f -t% f $ ENV {F} -y% 03d.mkv \ n", $ se, ($ ss- $ se), $ ctr; } if (/ silence_end: (\ S +) /) {$ se = 1 $; } END {printf "ffmpeg -nostdin -i input.mkv -ss% f $ ENV {F} -y% 03d.mkv \ n", $ se, $ ctr + 1; } "| bash -x' –
Ten jeden linijek nie działa na Macu. -bash: błąd składni w pobliżu nieoczekiwanego tokenu '& ' –
@JohnSmith, Mac ma domyślnie stare bash (pre-4). Zamień '| &' na '2> i 1 |'. –