Gå til innhold

Kommentar fra Innholdsansvarlig på Diskusjon.no: Fullt navn er ingen garanti for en saklig debatt

Foto

[Løst] Linux/ffmpeg/find - konvertere mange AAC-filer samtidig

Linux bash


3 svar i denne tråden

#1 geir__hk

geir__hk

    Bruker

  • Medlemmer
  • 6 614 innlegg
  •   3. november 2005

Skrevet 6. august 2019 - 21:49

Har en mappe med AAC audio-filer. Planen er å bruke ffmpeg til å "renske opp" i filene pga har en bilstereo som kun klarer å spille av noen av aac-filene.

Dette har jeg fått til for hver enkelt fil av gangen:

ffmpeg -i 'input.aac' -vn -c:a copy 'output.aac'

Jeg fant en forumtråd der et tilsvarende problem ble løst via find -kommandoen:

https://unix.stackex...-multiple-files

 

Eksempel på kommando (kopiert/limt inn fra nevnte nettside):

find . -name "*.js" -exec java -jar compiler.jar --js {} --js_output_file new{} \;

Slik jeg leser kommandoen i eksemplet, så burde det være en enkel sak å tilpasse det til ffmpeg -kommandoen jeg prøver å kjøre på aac-filene i mappa. Prøver på en variant som oppretter ny fil med samme navn, som får "NEW" i begynnelsen av filnavnet.

 

I teorien : Enkelt - easy-peecy

I praksis : Får det overhodet ikke til å fungere :wallbash:

 

Dette er de kommandoene jeg har prøvd å kjøre i terminal:

find . -name "*.aac" -exec ffmpeg -i {}  -vn -c:a copy 2_{}
find . -name "*.aac" -exec ffmpeg -i {}  -vn -c:a copy 2_{} \;
find . -name "*.aac" -exec ffmpeg -i {}  -vn -c:a copy NEW{} \;
find . -name "*.aac" -exec ffmpeg -i {}  -vn -c:a copy NEW{}\;
find . -name "*.aac" -exec ffmpeg -i {}  -vn -c:a copy NEW{} \;
find . -name "*.aac" -exec ffmpeg -i '{}'  -vn -c:a copy 'NEW{}'\;

Når kommandoene kjøres, kan jeg enkelt se at de traverserer hver enkel ac-fil i tur og orden, problemet er bare at ffmpeg printer en feilmelding på hver av filene som blir traversert - noe slik som dette:
NEW./input-file-name.aac: No such file or directory

 

Nå kan jeg ikke "se" de eksakte kommandoene som ffmpeg mottar, men utfra feilmeldinga ser det ut til at det være noe surr angående formattering på filnavnet :hmm:

 

Er åpen for en løsning mhp lage et .sh script dersom dette skulle vise seg å ikke være mulig via en enkeltstående kommando.



Beste svar Occi, 7. august 2019 - 15:10

Hva med bare en enkel loop i sh/bash? Testet bare med noen dummyfiler som eksempel på kopiering og renaming av filer:

$ touch foo.aac bar.aac
$ for i in *.aac; do cp "$i" "NEW$i"; done
$ ls -l
total 0
-rw-rw-r-- 1 user user 0 Aug  7 16:05 bar.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:05 foo.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:05 NEWbar.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:05 NEWfoo.aac

Kan også være greit å være klar over at hvis du ønsker å endre file extension, f. eks hvis du konverterer til noe annet enn AAC med ffmpeg, eller du ønsker å legge til etter basename så kan du bruke parameter expansion:

$ for i in *.aac; do cp "$i" "${i%.*}_new.aac"; done
$ ls -l
total 0
-rw-rw-r-- 1 user user 0 Aug  7 16:06 bar.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:07 bar_new.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:06 foo.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:07 foo_new.aac

For å gjøre dette med ffmpeg vil det nok se slik ut, uten at jeg har testet selv:

for i in *.aac; do ffmpeg -i "$i" -vn -c:a copy "NEW_$i"; done
Gå til hele innlegget

Dette innlegget har blitt redigert av geir__hk: 6. august 2019 - 21:51

  • 0

Jeg har sett lyset. Da jeg strakte meg etter det, så brant jeg meg fordi glødepæra viste seg å være varm Nå er de fleste lampene hjemme av type LED, så jeg merket ikke så mye til denne varmen da jeg tok på pæra.


#2 Occi

Occi

    Bruker

  • Medlemmer
  • 6 045 innlegg
  •   28. juli 2007

Skrevet 7. august 2019 - 15:10   Beste svar

Hva med bare en enkel loop i sh/bash? Testet bare med noen dummyfiler som eksempel på kopiering og renaming av filer:

$ touch foo.aac bar.aac
$ for i in *.aac; do cp "$i" "NEW$i"; done
$ ls -l
total 0
-rw-rw-r-- 1 user user 0 Aug  7 16:05 bar.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:05 foo.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:05 NEWbar.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:05 NEWfoo.aac

Kan også være greit å være klar over at hvis du ønsker å endre file extension, f. eks hvis du konverterer til noe annet enn AAC med ffmpeg, eller du ønsker å legge til etter basename så kan du bruke parameter expansion:

$ for i in *.aac; do cp "$i" "${i%.*}_new.aac"; done
$ ls -l
total 0
-rw-rw-r-- 1 user user 0 Aug  7 16:06 bar.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:07 bar_new.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:06 foo.aac
-rw-rw-r-- 1 user user 0 Aug  7 16:07 foo_new.aac

For å gjøre dette med ffmpeg vil det nok se slik ut, uten at jeg har testet selv:

for i in *.aac; do ffmpeg -i "$i" -vn -c:a copy "NEW_$i"; done

Dette innlegget har blitt redigert av Occi: 7. august 2019 - 15:13

  • 0

#3 geir__hk

geir__hk

    Bruker

  • Medlemmer
  • 6 614 innlegg
  •   3. november 2005

Skrevet 7. august 2019 - 17:30

Takker så meget. Da har jeg fått meg en dytt i riktig retning mhp lære meg bash scripting (om ikke annet, så veldig basic)

 

Kan bekrefte at følgende kommando fungerer:

for i in *.aac; do ffmpeg -i "$i" -vn -c:a copy "NEW$i"; done

 

Men så fant jeg ut at jeg vil oppgradere:

- nye filer skal ha samme fildato som de gamle

- vil heller at de gamle filene skal omdøpes istedet for de nye.

- Vil ha mellomrom i output mellom hver fil i Terminalvinduet

 

Så jeg fant denne guiden for bash loop på nettet:

https://www.cybercit.../bash-for-loop/

 

Og endte opp med følgende bash-script - testet og fungerer:

#!/bin/bash

for i in *.aac
do
	echo ""
	ffmpeg -i "$i" -vn -c:a copy "NEW_$i"
	touch -cm --reference="$i" "NEW_$i"
	
	mv "$i" "OLD $i"
	mv "NEW_$i" "$i"
	
	echo ""
done

Konklusjon: Dette fungerer for meg og saken er løst :thumbs:


  • 0

Jeg har sett lyset. Da jeg strakte meg etter det, så brant jeg meg fordi glødepæra viste seg å være varm Nå er de fleste lampene hjemme av type LED, så jeg merket ikke så mye til denne varmen da jeg tok på pæra.


#4 tingo

tingo

    Bruker

  • Medlemmer
  • 3 532 innlegg
  •   27. april 2005

Skrevet 11. august 2019 - 15:19

Et tips når det gjelder find: den har også '-print' som printer filnavnet for hver gang den evaluerer. Ofte så gir det nødvendig hint om hva som er feil.


  • 1
Torfinn



0 bruker(e) leser denne tråden

0 medlemmer, 0 gjester, 0 skjulte brukere