1

В настоящее время я пытаюсь использовать cdparanoia для воспроизведения с аудио-CD напрямую, без создания каких-либо временных файлов. Я могу воспроизвести первый трек в режиме реального времени, выполнив

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

однако я не хочу использовать этот метод, потому что он создает временные файлы, иногда мой /dev /shm полон и потому что я хочу более элегантное решение, которое можно записать в одну строку.

Я попробовал два решения для Linux, используя bash.

Первый:

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

Ничего не сделал. Второй:

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

Это просто издавало случайные царапающие звуки, показывающие, что данные не отформатированы правильно. Я подозреваю, что это может быть 16 бит вместо 8 бит.

Если у кого-то есть решение, дайте мне знать. Я ищу решение POSIX Bash в одну строку без временных файлов.

3 ответа3

1

Я знаю, очень старый вопрос, но никто не ответил ...

Передача выходного сигнала cdparanoia непосредственно в приемник аудио не очень практична. Первая проблема заключается в том, что любое обнаружение и исправление ошибок не будет выполняться в режиме реального времени, фактически для получения правильного результата потребуется столько времени, сколько необходимо. Даже если ошибок не обнаружено, повторяющиеся перекрывающиеся чтения означают, что маловероятно, что они будут выводить данные в реальном времени. Наконец, даже если все режимы обнаружения и исправления отключены (PARANOIA_MODE_DISABLE), библиотека считывает за один раз огромные порции данных (стоимостью более 10 секунд), что позволяет выполнять несколько проходов по этим данным. Затем он сбрасывает это и пытается получить еще 10 секунд, в то время как ваш звук может остановиться даже на самом быстром диске и процессоре.

Запустив cdparanoia с небольшим кэшем (1-2 секунды) и отключив все исправления ошибок, вы можете получить данные из cdparanoia в режиме реального времени. Опция -p выдаст 16-битные необработанные данные PCM. 16 бит должно быть хорошо. Вам может понадобиться указать порядковый номер, используя -r/R. Я не думаю, что вы можете просто передать необработанный звук в /dev /sound, это из учебников истории, но в зависимости от ваших звуковых драйверов, возможно, это будет работать. Лучше всего придумать игру с игрой, но в игре может быть что угодно, сказать, какие варианты вам понадобятся. aplay удобен с alsa, но вам нужно будет сообщить ему, что такое необработанные данные, что-то вроде: aplay -c 2 -f S16_LE -r 44100

1

Для тех, кто ищет ответы здесь:
Я не мог найти способ заставить cdparanoia выводить на stdout, но cd-read из libcdio-utils может выводить прямо с CD. Вы можете использовать эту команду для воспроизведения CD:

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

Это будет считывать <sectors> начиная с <start> , регулировать их до правильного битрейта и воспроизводить вывод через динамики. Я использовал 0 для <start> и 40000 для <sectors> в качестве теста, но вы можете получить правильные значения из cdparanoia -Q .
Если вы хотите, чтобы pv показывал текущую позицию / длину, добавьте --size <sectors*2352> в конец pv -L 176400 .

РЕДАКТИРОВАТЬ: Вот сценарий оболочки, который я написал, который может воспроизводить компакт-диски из командной строки. Вы можете ввести без аргументов (первый -> последний), начальный трек (начало -> последний), начальный и конечный треки (начало -> конец) или ~ для случайного выбора (? ->?).

#!/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 '{print $4}');
    LENGTH=$(echo "$CDINFO" | grep " $START\. " | awk '{print $2}');
    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

Пропускать cdparanoia напрямую к какому-либо выводу вообще не имеет смысла: идея cd paranoia состоит в том, чтобы быть параноиком по поводу возможных неточностей и многократно читать все, если в приводе CD есть джиттер и т.д.

Если вы просто хотите воспроизводить аудиодорожки прямо на CD, вы можете использовать, например, mplayer:

mplayer cdda://

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .