cdparanoia durch spielen, aplay, / dev / sound usw

1004
Sudo Bash

Derzeit versuche ich, cdparanoia für die direkte Wiedergabe von einer Audio-CD zu verwenden, ohne temporäre Dateien zu erstellen. Ich kann den ersten Track einer CD in Echtzeit spielen

cdparanoia -e 1 /dev/shm/tmp.wav 2>/dev/null & play /dev/shm/tmp.wav 

Ich möchte diese Methode jedoch nicht verwenden, weil sie temporäre Dateien erstellt, manchmal / dev / shm voll ist und ich eine elegantere Lösung möchte, die in einer Zeile geschrieben werden kann.

Ich habe zwei Lösungen unter Linux mit bash ausprobiert.

Der Erste:

cdparanoia -e 1 - 2>/dev/null | play - 

Tat nichts. Der Zweite:

cdparanoia -pe 1 - 2>/dev/null 1>/dev/sound 

Dies führte nur zu zufälligen Kratzern, die zeigten, dass die Daten nicht richtig formatiert wurden. Ich vermute, es kann 16bit anstelle von 8bit sein.

Wenn jemand eine Lösung hat, lass es mich wissen. Ich suche eine POSIX Bash-Lösung in einer Zeile ohne temporäre Dateien.

1

3 Antworten auf die Frage

1
Ian Nartowicz

Ich weiß, sehr alte Frage, aber niemand hat geantwortet ...

Das direkte Piping der CDparanoia-Ausgabe in eine Audioausgabesenke ist nicht sehr praktisch. Das erste Problem ist, dass jegliche Art von Fehlererkennung und -korrektur nicht in Echtzeit ausgeführt wird. In der Tat dauert es so lange, bis die korrekte Ausgabe erfolgt. Selbst wenn keine Fehler erkannt werden, bedeutet das wiederholte überlappende Lesen, dass die Ausgabe in Echtzeit unwahrscheinlich ist. Selbst wenn alle Erkennungs- und Korrekturmodi deaktiviert sind (PARANOIA_MODE_DISABLE), liest die Bibliothek riesige Datenblöcke gleichzeitig (Wert über 10 Sekunden), um mehrere Durchläufe über diese Daten zu ermöglichen. Dann wird das abgespeichert und versucht, weitere 10 Sekunden zu erhalten, während Ihr Audio selbst auf dem schnellsten Laufwerk und der schnellsten CPU pausiert.

Wenn Sie cdparanoia mit einem kleinen Cache (1-2 Sekunden) ausführen und alle Fehlerkorrekturen deaktiviert sind, können Sie Daten in Echtzeit aus cdparanoia holen. Die Option -p erzeugt 16-Bit-PCM-Rohdaten. 16 Bit sollte in Ordnung sein. Möglicherweise müssen Sie die Endiananness mithilfe von -r / R angeben. Ich denke nicht, dass Sie rohe Audiodaten einfach mehr nach / dev / sound pfeifen können, das ist aus den Geschichtsbüchern, aber abhängig von Ihren Soundtreibern wird es vielleicht funktionieren. Piping to play ist eine bessere Idee, aber das Spiel könnte alles andere als schwer zu sagen sein, welche Optionen Sie benötigen. aplay ist praktisch als asa, aber Sie müssen wissen, was die Rohdaten sind, etwa: aplay -c 2 -f S16_LE -r 44100

1
JackMacWindows

Für alle, die hier nach Antworten suchen:
Ich konnte keinen Weg finden, um cdparanoiazu stdout zu gelangen, aber cd-readvon libcdio-utilskann direkt von der CD aus. Mit diesem Befehl können Sie die CD abspielen:

cd-read -m audio -s <start> -n <sectors> --no-hexdump | pv -L 176400 | aplay -c 2 -f S16_BE -r 44100 

Dies liest <sectors>Sektoren ab <start>, drosselt sie auf die richtige Bitrate und gibt die Ausgabe über die Lautsprecher wieder. Ich habe 0 für <start>und 40000 für <sectors>einen Test verwendet, aber Sie können die korrekten Werte abrufen cdparanoia -Q.
Wenn Sie pvdie aktuelle Position / Länge anzeigen möchten, fügen Sie --size <sectors*2352>am Ende von hinzu pv -L 176400.

BEARBEITEN: Hier ist ein Shellskript, das ich geschrieben habe und CD von der Befehlszeile aus abspielen kann. Sie können keine Argumente (erster -> letzter), den Start-Track (Start -> Letzter), den Start- und End-Track (Start -> Ende) oder ~für Shuffle (? ->?) Eingeben.

#!/bin/bash CDINFO="$(cdparanoia -Q 2>&1 | grep -E "[0-9]+\. ")"; TRACKS=$(echo "$CDINFO" | wc -l); if [ $# -lt 1 ]; then START=1; else if [ $1 == '~' ]; then RAND=1; START=$(expr $RANDOM \% $TRACKS + 1); else START=$1; fi;$ if [ $# -lt 2 ]; then END=-1; else END=$2; fi;  while (true); do STARTBLOCK=$(echo "$CDINFO" | grep " $START\. " | awk ''); LENGTH=$(echo "$CDINFO" | grep " $START\. " | awk ''); echo "Playing track $START..."; cd-read -m audio -s $STARTBLOCK -n $LENGTH --no-hexdump | pv -L 176400 --size $(expr $LENGTH \* 2352) | aplay -c 2 -f S1$ if [ "$RAND" == "1" ]; then START=$(expr $RANDOM \% $TRACKS + 1); else START=$(( $START + 1 )); fi; if [ $END -ne -1 ]; then if [ $START -gt $END ]; then break; fi; fi; if [ $START -gt $TRACKS ]; then break; fi; done; 
0
dirkt

Die direkte Weiterleitung von CD- Paranoia an einen bestimmten Ausgang macht überhaupt keinen Sinn: Die Idee der CD- Paranoia besteht darin, mögliche Ungenauigkeiten paranoid zu machen und alles wiederholt zu lesen, wenn das CD-Laufwerk Jitter usw. hat.

Wenn Sie nur Audiotitel direkt auf der CD abspielen möchten, können Sie zB mplayer verwenden:

mplayer cdda://