• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Textdatei als Liste Übergeben ? [gelöst]

DarkFireX

Newbie
Hallo zusammen.

Die Funktionsweise der Verkettung von Befehlen wie zum Beispiel:
Code:
 $ls *jpg | jpeg2yuv -f 25 -I p > result.yuv
ist hinlänglich bekannt.
Diese Verfahrensweise in diesem Beispiel hat den Nachteil das, wenn man jede Datei als Einzelbild übergibt, dieses auch nur 1/25 Sekunde angezeigt wird.
Nun kann man ja ein Script erstellen welches jede Datei 25 mal angibt und dieses Ergebis in einer Textdatei auflistet.
Somit würde der 2. Befehl jeden Eintrag 25 mal erhalten und ich hätte einen Film der jedes Einzelbild 1 Sekunde anzeigt.

Diese Datei möchte ich nun der gleichen Verkettung übergeben - leider ohne Erfolg:

Code:
$cat liste.txt | jpeg2yuv -f 25 -I p > result.yuv

Um zu bemerken: Es geht mir hier nicht um ein Problem der mjpeg-Tools ( das habe ich mit "convert" eleganter lösen können) sondern vielmehr darum wie ich eine Textdatei genau so verketten kann wie dies in dem obigen Beispiel (mit ls) auch funktioniert. Ich habe dieses Problem noch an anderer Stelle aber das Prinzip ist das Gleiche.

Wo liegt mein Denkfehler dass der 2. Befehl (hier jpeg2yuv) aus der übergebenen Dateiliste nur den ersten Eintrag übernimmt und den Rest übersieht ?

Danke für jeden Tip
-DFX
 
A

Anonymous

Gast
ich glaube mal so einfach und so umfassend wie du es gerne haben möchtest ist es ganau an dieser Stelle nicht.

Es gibt da unzählige kleine Tools, die genau für eine einzige Aufgabe gemacht wurden. Zwar läßt sich da noch mehr mit anrichten, aber manchmal muss man dort ganz schon tricksen. Und es gibt mindestens 2 große Pakete, die universell aus Bausteinen bestehen.

Bei den kleinen Tools ist es so, "Von Standard-Eingabe lesen" ist nicht das selbe wie "Standard-Eingabe lesen". Die einen verstehen nur etwas wenn du ihnen eine Sequenz gleichartiger Bilder übergibst (cat *.jpg) , die anderen lesen Dateinamen (ls *.jpg), die nächsten lesen nur eine Dateimaske ( bild%6d.jpg) und suchen dann entsprechend selbst , das nächste ließt nur wiederum Dateinamen aus der ersten Zeile, usw. Da sind eben Tools dabei die lesen zB nur die erste Zeile, und wenn du die Dateinamen zB jeden in einer eigenen Zeile hast, dann wird dann eben nur der erste erkannt, selbst wenn du einen Roman von Bildernamen übergibst. Hier hilft meist nur Manpage lesen, Optionen überprüfen, ausprobieren und im Internet nach Beispielen suchen.

Ansonsten kleiner Trick
geht deine Bilderliste nicht, dann versuchen die Zeilenvorschübe herauszufiltern. (Hier Konsolausgabe als Beispiel)
Code:
~/film102> ls *.ppm
ende102.ppm  k_frame.ppm  last.ppm  next.ppm
~/film102> ls *.ppm > liste
~/film102> cat liste
ende102.ppm
k_frame.ppm
last.ppm
next.ppm
~/film102> cat liste | tr "\n" " "
ende102.ppm k_frame.ppm last.ppm next.ppm ~/film102>
oder wenn er die Ausgabe von ls akzepieren sollte, die Bilder gleich an Ort und Stelle duplizieren
Code:
~/film102> ls *.ppm{,,,,,,,,,,}
ende102.ppm  ende102.ppm  ende102.ppm  k_frame.ppm  k_frame.ppm  k_frame.ppm  last.ppm  last.ppm  last.ppm  next.ppm  next.ppm
ende102.ppm  ende102.ppm  ende102.ppm  k_frame.ppm  k_frame.ppm  k_frame.ppm  last.ppm  last.ppm  next.ppm  next.ppm  next.ppm
ende102.ppm  ende102.ppm  ende102.ppm  k_frame.ppm  k_frame.ppm  last.ppm     last.ppm  last.ppm  next.ppm  next.ppm  next.ppm
ende102.ppm  ende102.ppm  k_frame.ppm  k_frame.ppm  k_frame.ppm  last.ppm     last.ppm  last.ppm  next.ppm  next.ppm  next.ppm
Ansonsten gibt es viele Tools die Optionen haben mit denen man Einzelbilder im Stream vermehrt (duplizieren) kann.
zB bei ppmtoy4m die Option -n und -r

oder es lassen sich bei machen Programmen durch Optionen intern automatisch Bildduplizierungen erreichen indem die Framerate im Sekundentakt beim Dateneingang aber eine normale 1/25 für den Datenausgang angegeben wird.

Bei den großen Toolsammlungen und Programmen (transcode ; mplayer/mencoder) gibt es in der Regel auch spezielle Eingabefilter, darunter meist auch einen oder mehrere für Einzelbilder oder auch Bilderlisten. Als Beispiel mal eine Ausschnitt einer Zeile (Eingabebereich) aus einem meiner Scripte auf transcode beruhend. LISTE ist hier die Bilderlistendatei
Code:
transcode -i LISTE -H 0 -f 25 -g 720x576 -V rgb24 -x imlist,null .............................

robi
 
OP
DarkFireX

DarkFireX

Newbie
Hallo robi,

vielen Dank für Deine ausführliche Antwort.
Den Verweis auf man-pages, google, beispiele etc. ist obsolete :) Bin ja kein 'kleiner' Dummer mehr (-:
Aber zum Thema:
Deine Einführung ist mir vollkommen klar und Verständlich. Jedoch ändert dies nichts an dem Problem selbst, mit welchem ich mich herumprügle.
Auch Deine Lösungsansätze sind mir geläufig (bis auf Einen *) und wurden zur Lösung schon umgesetzt - sonst hätte ich dieses Thema sicher nicht eröffnet.
Es ist mir in der Verwaltung diverser Server schon oft untergekommen das zwar ein
Code:
$ls *jpg|jpeg2yuv ... >datei
problemlos funktioniert. Was jedoch verwunderlich (für mich) ist, das hier zum Beispiel die auch von Dir vorgeschlagene Form:
Code:
$ls *jpg{,,,,,}|jpeg2yuv ... >datei.yuv
n i c h t funktioniert obwohl es am Stream selbst absolut nichts auszusetzen gibt.
Das war der Eine (*)

Hierfür versuche ich die Begründung zu finden und sie in einem Script umsetzen zu können.

Klar gibt es andere Lösungen welche das Problem elegant umschiffen (convert ist so ein Tool) aber das hilft mir nicht bei der Antwort warum es ausgerechnet in dem von mir beschriebenen Beispiel nicht funktioniert.

Ich mag solche Vorkommnisse gern geklärt als einfach faul nach einem anderen Tool zu suchen (was ich ja getan habe). Aber ich möchte verstehen "WARUM" es nicht funzt.

Beste Grüße und nochmals DANKE!
 

abgdf

Guru
Bin nicht sicher, willst Du sowas machen (ungetestet):
Code:
#!/bin/bash

for i in "ls *jpg"
do
    for ((u=1; u<=25; u++))
    do
        echo $i | jpeg2yuv -f 25 -I p > result.yuv
    done
done
?

Ich hatte auch mal Probleme mit sowas:

http://www.angelfire.com/linux/tux25/bash/bash_de.html#18

HTH

Gruß
 
A

Anonymous

Gast
Keine Ahnung was bei dir verbogen ist :???: sowohl
Code:
$ls *jpg | jpeg2yuv -f 25 -I p > result.yuv
als auch
Code:
$ls *.jpg > liste.txt
$cat liste.txt | jpeg2yuv -f 25 -I p > result.yuv
liefen jetzt bei mir bei Tests mit 10000 Einzelbildern problemlos
Die Einzelbilder hab ich dazu aus einem Video erstellt.
Code:
transcode -i test1.m2v -o ./0 -Z 720x576 -f 25 -x mplayer  -y jpg

Code:
 ls *jpg{,,,,,,,,} | jpeg2yuv -f 25 -I p > result.yuv
ging allerdings auch nicht.
Bei näherer Untersuchung jpeg2yuv mag scheinbar keine doppelt vorkommenden Dateinamen.
wenn ich in der liste.txt nur den ersten Dateinamen doppelt reinschreiben, gehts schon nicht mehr.
INFO: [jpeg2yuv] No more frames. Stopping.
sobald er merkt das der Dateiname sich wiederholt.
Dummes Tool eben, kannst ja mal versuchen auf jede Datei 24 Hardlinks zu setzen, eventuell läßt es sich so austricksen wenn er so für die selbe Datei immer 25 andere Dateinamen erhält ;) ;) ;) ;) ;) ;) so nen Schwachfug hab ich natürlich gar nicht erst getestet.


getestet auf Suse 10.3 32Bit
# rpm -qf /usr/bin/jpeg2yuv
mjpegtools-1.9.0.0-0.pm.0

bash --version
GNU bash, version 3.2.25(1)-release (i586-suse-linux-gnu)


robi
 
OP
DarkFireX

DarkFireX

Newbie
Hallo @all

vielen Dank für die Tips.

robi hat letztlich den Ausschlag für die nachfolgende "dreckige" Lösung geliefert.
jpeg2yuv ist tatsächlich nicht in der lage doppelte Bilder zu akzeptieren ):
Das ist echt ....ohne Worte.... da ich einen Grund dafür nicht erkennen kann....
Code:
mkdir ./pic
for i in $(ls image.*.jpg{,,,,,,,,,,,,})
  do
    n=$((n + 1))
    FLN=$(printf "%06d" $n)
    #echo "$FLN.jpg"
    cp $i ./pic/$FLN.jpg
  done

jpeg2yuv -v 0 -b 1 -f 25 -I p -j ./pic/%06d.jpg | yuvscaler -v 1 -O DVD | mpeg2enc -v 0 -f 9 -o video.m2v
rm ./pic/*
rmdir ./pic
Diese Lösung arbeitet dann auch so wie sie es soll.

Danke nochmals an alle!

-DFX
 
Oben