Strona 2 z 2

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

: 30 gru 2011, 14:35
autor: Mały 1
Dziękuje za napisanie skryptu, którego działanie sprawdziłem w praktyce.

Skrypt działa poprawnie, ale pozostał jeszcze jeden problem do rozwiązania. Problem polega na tym, że skrypt nie zawsze przerywa swoje działanie po podzieleniu całego filmu.

Oto przykład, gdzie skrypt poprawnie zakończył działanie (film dzielony na części po 100 MB):

Kod: Zaznacz cały

pic@nk:~/Pulpit/teścik$ bash zforum 
Czas trwania: 6180
Czas trwania fragmentu: 942
Czas całkowity: 942

Skipping frame!
Czas trwania fragmentu: 1008
Czas całkowity: 1950

Skipping frame!
Czas trwania fragmentu: 956
Czas całkowity: 2906

Skipping frame!
Czas trwania fragmentu: 633
Czas całkowity: 3539

Skipping frame!
Czas trwania fragmentu: 951
Czas całkowity: 4490

Skipping frame!
Czas trwania fragmentu: 760
Czas całkowity: 5250

Skipping frame!
Czas trwania fragmentu: 928
Czas całkowity: 6178
pic@nk:~/Pulpit/teścik$ 
Teraz przykłady gdzie skrypt nie przerywa działania po podzieleniu ostatniej części.

Ten sam film, ale dzielony na części po 300 MB:

Kod: Zaznacz cały

pic@nk:~/Pulpit/teścik$ bash zforum 
Czas trwania: 6180
Czas trwania fragmentu: 2904
Czas całkowity: 2904

Skipping frame!
Czas trwania fragmentu: 2345
Czas całkowity: 5249

Skipping frame!
Czas trwania fragmentu: 928
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
^C
pic@nk:~/Pulpit/teścik$ 
Tym razem tan sam film dzielony na części po 400 MB:

Kod: Zaznacz cały

pic@nk:~/Pulpit/teścik$ bash zforum 
Czas trwania: 6180
Czas trwania fragmentu: 3535
Czas całkowity: 3535

Skipping frame!
Czas trwania fragmentu: 2640
Czas całkowity: 6175
Czas trwania fragmentu: 0
Czas całkowity: 6175
Czas trwania fragmentu: 0
Czas całkowity: 6175
Czas trwania fragmentu: 0
Czas całkowity: 6175
Czas trwania fragmentu: 0
Czas całkowity: 6175
Czas trwania fragmentu: 0
pic@nk:~/Pulpit/teścik$ 
Teraz już ostatnia próba i dzielimy go na części po 50 MB:

Kod: Zaznacz cały

pic@nk:~/Pulpit/teścik$ bash zforum 
Czas trwania: 6180
Czas trwania fragmentu: 436
Czas całkowity: 436

Skipping frame!
Czas trwania fragmentu: 506
Czas całkowity: 942

Skipping frame!
Czas trwania fragmentu: 570
Czas całkowity: 1512

Skipping frame!
Czas trwania fragmentu: 434
Czas całkowity: 1946

Skipping frame!
Czas trwania fragmentu: 473
Czas całkowity: 2419

Skipping frame!
Czas trwania fragmentu: 484
Czas całkowity: 2903

Skipping frame!
Czas trwania fragmentu: 358
Czas całkowity: 3261

Skipping frame!
Czas trwania fragmentu: 283
Czas całkowity: 3544

Skipping frame!
Czas trwania fragmentu: 469
Czas całkowity: 4013

Skipping frame!
Czas trwania fragmentu: 478
Czas całkowity: 4491

Skipping frame!
Czas trwania fragmentu: 403
Czas całkowity: 4894

Skipping frame!
Czas trwania fragmentu: 354
Czas całkowity: 5248

Skipping frame!
Czas trwania fragmentu: 472
Czas całkowity: 5720

Skipping frame!
Czas trwania fragmentu: 457
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
Czas trwania fragmentu: 0
Czas całkowity: 6177
pic@nk:~/Pulpit/teścik$ 
Podsumowanie powyższych wyników:

Czas trwania: 6180

100 MB Czas całkowity: 6178 (skrypt zakończył działanie)
300 MB Czas całkowity: 6177 (skrypt nie zakończył działania)
400 MB Czas całkowity: 6175 (skrypt nie zakończył działania)
50 MB Czas całkowity: 6177 (skrypt nie zakończył działania)

Wniosek jest taki, że jeżeli różnica między czasem trwania (całego filmu), a czasem całkowitym (podzielonych części) wyniesie więcej niż 2 sekundy to skrypt nie kończy dzielenia.

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

: 30 gru 2011, 15:14
autor: ethanak
No niestety - wada tego skryptu (jak widziałeś odejmuję 2 sekundy, ale zdaje się że dokładność jest nieco problematyczna). Operowanie z jednej strony czasem (bo nie da się rozpocząć od "megabajta") a z drugiej wielkością może wnosić błędy. Fakt - sprawdzałem to na kilku tylko filmach i w moim przypadku błąd nie przekroczył dwóch sekund, stąd moje radosne założenie.
Można spróbować to naprawić: jeśli pozostała ilość czasu jest na poziomie przeciętnego czasu partii (tzn. niewiele większa) lub mniejsza, nie podajesz parametru "endpos". Jeśli powstała część mieści się w założonej wielkości - kończysz pracę. W przeciwnym przypadku usuwasz powstały plik i przeprowadzasz normalny podział.
Spróbujesz się z czymś takim?
Bo w najprostszym przypadku wystarczy pewnie zmienić stałą "2" na powiedzmy "10" i mieć nadzieję że nie utnie nam ostatnich 10 sekund...

Re: Bash – jak dodać kolejny numer do nowo tworzonego pliku?

: 30 gru 2011, 19:40
autor: Mały 1
Z programowaniem nigdy nie miałem do czynienia. Pierwszy raz o programowaniu w powłoce Bash poczytałem kilka dni temu, ale to jest zdecydowanie za mało. Dlatego w tej chwili sam nie będę kaleczył Twojego skryptu. Jeżeli zaś będzie możliwość przetestowania skryptu z nową funkcją o której wspomniałeś wyżej to podzielę się swoją opinią na forum odnośnie jego działania.

Zastanawiałem się też nad tym, jak najprościej zdefiniować, aby skrypt samodzielnie kończył pracę.
Gdyby do skryptu dodać wpis, aby przed utworzeniem kolejnej części CD-*.avi wykonywać polecenie:

Kod: Zaznacz cały

pic@nk:~/Pulpit/test $ mplayer -identify -nosound -vo null -frames 0 CD-1.avi 2>/dev/null | awk -F= '/ID_LEN/ {print int($2)}'
5249
pic@nk:~/Pulpit/test $ 
Jeżeli wynik powyższego polecania będzie różny od zera to skrypt nie powinien kończyć swojej pracy, aż do momentu kiedy wynikiem będzie zero.

Kod: Zaznacz cały

pic@nk:~/Pulpit/test $ mplayer -identify -nosound -vo null -frames 0 CD-4.avi 2>/dev/null | awk -F= '/ID_LEN/ {print int($2)}'
0
pic@nk:~/Pulpit/test $ echo "Czas trwania: $orglen"

Zarówno gotowe rozwiązania, jak i uwagi mile widziane.


EDIT:

Zmodyfikowany, ale działający skrypt, który po podzieleniu filmu na części samodzielnie kończy pracę.

Kod: Zaznacz cały

#!/bin/bash
nazwa=nazwa_dzielonego_filmu
mb="100mb"
n=0

mencoder -ovc copy -oac copy -endpos "$mb" -o CD-$((n + 1)).avi "$nazwa" 

for a in "$nazwa"; do mv $a `basename $a .avi`.wmv; done

while [ 1 ]; do

find -type f -name "CD-*.avi" -print0 | xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | tail -n 1 > dane.txt; sleep 3

for a in *.wmv; do mv $a `basename $a .wmv`.avi; done

mencoder -ovc copy -oac copy -ss $(date -d @$(($(date -d $(sed -n '1p' dane.txt) +%s) - 20)) +%H:%M:%S) -endpos "$mb" -o CD-$(echo "numer=`ls CD-* | awk -F. 'BEGIN {m=0}; /-[0-9]/ {n=int(substr($1,4));if (n>m) m=n} END {print m+1}'`" > tmp.txt; awk 'BEGIN { FS = "=" } ; { print $2 }' tmp.txt; rm -f tmp.txt).avi "$nazwa"; sleep 3 

zmienna1="$($echo find -type f -name CD-$(echo "numer=`ls CD-* | awk -F. 'BEGIN {m=0}; /-[0-9]/ {n=int(substr($1,4));if (n>m) m=n} END {print m}'`" > tmp.txt; awk 'BEGIN { FS = "=" } ; { print $2 }' tmp.txt).avi -print0 | xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | tail -n 1)"

zmienna2="00:00:00"

if [ "$zmienna1" = "$zmienna2" ] ; then break; fi

done
Dziękuje wszystkim za pomoc.