Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Multimedia ja grafiikka => Aiheen aloitti: jarmala - 06.08.18 - klo:21.13
-
Tuli eteen ongelma: miten listaan ziljoonan videotiedoston ominaisuudet? Kiinnostus olisi tällä kertaa resoluutioon. Mllä ohjelmalla saan listan
file1<tab>1920<tab>1080
file2<tab>720<tab>576
...
ffprobe ja avprobe eivät pukkaa tulostettaan stdout:iin, joten niistä ei saa grepillä tietoja ulos.
Exiftool tulostaa stdout:iin, mutta taitoni eivät riitä poimimaan siitä nimeä, leveyttä ja korkeutta erilleen samalle riville...
-
Voit listata videon ominaisuuksia kätevimmin ffproben show_entries -toiminnon avulla. Videon resoluution saa csv:nä ulos tähän tapaan:
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of "csv=p=0" video.mp4
ziljoonan tiedoston listaus halutussa formaatissa onnistunee sitten vaikkapa findin avustuksella:
find /polku/videohakemistoon -printf '%p|' -exec ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of "csv=p=0:s=|" {} \; | tr '|' '\t'
Katso myös: https://trac.ffmpeg.org/wiki/FFprobeTips
ffprobe ja avprobe eivät pukkaa tulostettaan stdout:iin, joten niistä ei saa grepillä tietoja ulos.
Jos haluaa grepata stderriä, sekin kyllä onnistuu tarvittaessa ohjaamalla stderr stdoutiin:
joku_komento_joka_listaa_stderriin 2>&1 | grep hakusana
Mutta tätä ei tarvita tässä tapauksessa, kun ffprobesta saa asioita ulos fiksumminkin.
-
find /polku/videohakemistoon -printf '%p|' -exec ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of "csv=p=0:s=|" {} \; | tr '|' '\t'
Erinomaista!
Nyt jälkikäteen huomaa kuitenkin sen, että pitäisi miettiä kunnolla etukäteen, mitä toivoo... Mitenkähän saisin tuon tiedoston nimen viimeiseksi siinä rivillä? Tulisi siistimpi listaus.
-
Nyt jälkikäteen huomaa kuitenkin sen, että pitäisi miettiä kunnolla etukäteen, mitä toivoo... Mitenkähän saisin tuon tiedoston nimen viimeiseksi siinä rivillä? Tulisi siistimpi listaus.
Tämä taitaa olla hivenen mutkikasta, koska ffproben csv-ulostulo ei jostain syystä mahdollista eri kategorioiden metadatan tulostamista samalle riville, joten sillä ei saa suoraan listattua resoluutiota ja tiedoston nimeä yhdellä rivillä. Lisäksi se kirjoittaa rivinvaihdon loppuun, joten riviin on hankalaa lisätä asioita. Tietty rivinvaihdot voi korvata muilla merkeillä putkittamalla tr:lle, mutta menee purkkavirityksen puolelle.
Ei nyt äkkiseltään tule mieleen parempaa yhden rivin komentoa kuin tämä:
find . -exec bash -c 'echo -n $(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of "csv=p=0:s=|" {}); echo "|{}"' \; | tr '|' '\t'
Vaihtoehtoisesti voisi järjestää alkuperäisen listauksen sarakkeet uudelleen vaikkapa awk:lla tai perlillä.
-
find . -exec bash -c 'echo -n $(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of "csv=p=0:s=|" {}); echo "|{}"' \; | tr '|' '\t'
Vaihtoehtoisesti voisi järjestää alkuperäisen listauksen sarakkeet uudelleen vaikkapa awk:lla tai perlillä.
Juu, parempi sortteerata sarakkeita, koska tuo ei sellaisenaan toimi, koska tiedostojen nimissä on tietenkin myös välilyöntejä...
-
Juu, parempi sortteerata sarakkeita, koska tuo ei sellaisenaan toimi, koska tiedostojen nimissä on tietenkin myös välilyöntejä...
No sen voi korjata taktisilla lainausmerkeillä:
find . -exec bash -c 'echo -n $(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of "csv=p=0:s=|" "{}"); echo "|{}"' \; | tr '|' '\t'
Nyt menee rikki vain, jos nimissä on rivinvaihtoja, putkimerkkejä tai lainausmerkkejä. ;D
-
No sen voi korjata taktisilla lainausmerkeillä:
find . -exec bash -c 'echo -n $(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of "csv=p=0:s=|" "{}"); echo "|{}"' \; | tr '|' '\t'
Kiitoksia.
Väkersin siitä kyllä jo itsekin seuraavan:
find * -printf '%p|' -exec ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of "csv=p=0:s=|" {} \; | awk -F'|' '{printf "%6s %6s %s\n",$2,$3,$1}' | sort --key=1.15