LINUX.ORG.RU

ls | while read line; do mplayer «$line»; done

 


0

1

По случаю закрытия любимого радио, попытался рандомно послушать локальную музыку, но возникли кое какие проблемы.

ls | while read line; do mplayer "$line" < /dev/null; done

В данном примере mplayer играет, но не реагирует на горячие клавиши, выдаёт ошибку «Dead key input on file descriptor 0». Без /dev/null он не работает, выдаёт кучу таких ошибок.

Вместо mplayer пробовал ffplay, но тут он после воспроизведения файла не завершает свою работу почему-то. Выглядит так будто аудиофайл дальше содержит бесконечной длины тишину после музыки.

ls тут для краткости, на самом деле там

find /media/G/Music -type f \( -iname "*.mp3" -or -iname "*.ogg" -or -iname "*.flac" \) | sort --random-sort | while read line ...
но с ls поведение такое же.

А `man mplayer` ты не осилил?

Генерируй плейлист, потом запускай один-единственный `mplayer` с этим плейлистом. В итоге не будет на каждую новую песню запускаться новый экземпляр `mplayer` и твои настройки громкости не будут катиться к черту.

// кстати, какой-нибудь moc тебе обеспечит прямо таки функционал не хуже радио, разве что рекламы и болтунов не будет.

Eddy_Em ☆☆☆☆☆ ()
Последнее исправление: Eddy_Em (всего исправлений: 1 )
Ответ на: комментарий от Eddy_Em

и твои настройки громкости не будут катиться к черту

Я использую опцию -softvol

Генерируй плейлист, потом запускай один-единственный `mplayer` с этим плейлистом.

Слишком огромный плейлист. Надеялся что так будет в реалтайме работать сразу после запуска.

firestarter ★★★☆ ()
Ответ на: комментарий от firestarter

Слишком огромный плейлист

Так ты его один раз сделай.

Я использую опцию -softvol

Т.е. все равно несколько пробных запусков делаешь, чтобы выявить нужный уровень громкости. А так пультиком бы нащелкал, сколько надо.

Eddy_Em ☆☆☆☆☆ ()
Последнее исправление: Eddy_Em (всего исправлений: 1 )

mplayer -shuffle -playlist $PLAYLIST

mocp + shuffle + repeat

schizoid ★★★ ()
Ответ на: комментарий от Eddy_Em

Так ты его один раз сделай.

Дык его придётся каждый раз делать чтобы рандомно послушать музыку.

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

Нет, громкость выставлена в глобальном микшере, а mplayer по умолчанию запускается с почти максимальной громкостью.

firestarter ★★★☆ ()
Ответ на: комментарий от anonymous

find -regextype posix-egrep -iregex «.*\.(mp3|ogg)»|mplayer -shuffle -playlist -

Допустим, а как быть с ffplay (понравилось его окно визуализации и возможность перематывать мышкой трек)? Мне сейчас больше интересно почему мой вариант не работает.

firestarter ★★★☆ ()
Ответ на: комментарий от firestarter

Слишком огромный плейлист.

А sort так его осиливает, а mplayer не сможет?

выдаёт кучу таких ошибок

«ись Комар Слава Тебе показ а в шему нам с »

Однозначно, что mplayer пытается сказать вам что-то осмысленное :-)

А если по теме, то в вашем варианте в stdin перенаправлялся вывод ″ls″. Попробуйте перед циклом ″while″ сделать ″exec 3<&0 ″ и запускать ″mplayer <&3″. Или попробуйте отправить вывод ″ls″ в 3-ий дескриптор и читать read из него (опция ″-u″).

mky ★★★★★ ()
Ответ на: комментарий от mky

Попробуйте перед циклом ″while″ сделать ″exec 3<&0 ″ и запускать ″mplayer <&3″.

Спасибо, попробовал. С mplayer проканало:

exec 3<&0; ls|while read line; do echo "$line"; mplayer "$line" <&3; done
А вот с ffplay почему-то нет.

Или попробуйте отправить вывод ″ls″ в 3-ий дескриптор и читать read из него (опция ″-u″).

А вот это не совсем понял.

ls >&3 | while read -u 3 line; do ...; done
Так ругается на недопустимый дескриптор. Если перед этим сделать exec 3<&0 или exec 3>&1, то в переменную line ничего не попадает.

firestarter ★★★☆ ()

Я себе для подобной задачи костыль сгородил.

Вот так формирую список песен:

find random/music/ -type f -name "*.mp3" > songs.list

А вот этим потом его играю:

#!/usr/local/perl
#

use strict;
use warnings;

my %songs;
die "Can't open file: $ARGV[0]: $!" unless open(my $songs_list, "< $ARGV[0]");
my $counter = 0;
while (<$songs_list>) {
        chomp;
        s/(#.*|^\s+|\s+$)//g;
        $songs{$counter} = $_;
        $counter++;
}
close($songs_list);

while (1) {
        my $total = keys(%songs);
        my $number = int(rand($total));
        system('mplayer', $songs{$number});
        exit 0 if $? != 0;
}
Экспериментировал с листами свыше 100к песен, полсекунды скрипт запускается, памяти почти не ест(в реальности у меня столько песен на винте нет, так что вообще всё мгновенно).

shell-script ★★★★★ ()
Ответ на: комментарий от firestarter

Дык его придётся каждый раз делать чтобы рандомно послушать музыку.

-shuffle

в глобальном микшере

ХЗ, я глобальный не кручу. А то одним плеером накрутишь до фига, а на другом потом как заорет!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Так во всех плеерах громкость устанавливается на 100% (она по умолчанию такая везде) и там трогать её не требуется за исключением случаев когда слушаешь одновременно несколько источников и тебе нужно чтобы некоторые были потише относительно других.

firestarter ★★★☆ ()
Ответ на: комментарий от Eddy_Em

Не надо. Ты их просто готовить не умеешь.

Даже если бы там не была громкость по умолчанию на 100%, я бы её сам такой установил бы.

firestarter ★★★☆ ()
Ответ на: комментарий от Eddy_Em

И будешь глохнуть каждый раз при запуске плеера?

С какой стати, если общая громкость в микшере выставлена сколько нужно?

firestarter ★★★☆ ()
Ответ на: комментарий от firestarter

Я, кстати, тоже предпочитаю общей громкостью рулить, а не плеера. Как-то удобнее. Тем более, что общая висит на мультимедийных клавишах.

shell-script ★★★★★ ()
Ответ на: комментарий от firestarter

Я о том, уверен ли ты, что в ближайшее время школомейнтейнеры не запихают в арчик очередную говнотень, из-за которой вообще ничего работать не будет?

Скажем, заменят иксы на вяленого.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Ну у меня не Арч. Впрочем, я не представляю что тут можно сломать и как может быть по другому. Даже если бы я использовал Пульс, всё равно было бы то же самое, громкость всех приложений на 100%, а общая громкость сколько нужно.

firestarter ★★★☆ ()
Ответ на: комментарий от firestarter

громкость всех приложений на 100%, а общая громкость сколько нужно.

Ну вот. Играет, скажем, у тебя музыка. Тут ты решаешь киношку посмотреть, а музыку оставить. Ты же все равно полезешь в настройки звука, чтобы приглушить музыкоплеер!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от firestarter

У Эдди обострение по случаю наступающей весны. Не обращай внимания.

geekless ★★ ()
Ответ на: комментарий от Eddy_Em

Ты же все равно полезешь в настройки звука, чтобы приглушить музыкоплеер!

В pavucontrol выведены регуляторы гномкости от всех приложений, воспроизводящих в данный момент звук. С разморозкой. Как там в криокамере?

geekless ★★ ()
Ответ на: комментарий от Eddy_Em

Ну вот. Играет, скажем, у тебя музыка. Тут ты решаешь киношку посмотреть, а музыку оставить. Ты же все равно полезешь в настройки звука, чтобы приглушить музыкоплеер!

Ну я выше и писал что за исключением случаев когда ты слушаешь одновременно несколько источников и тебе нужно некоторые сделать тише относительно других. Но каким образом ты оглохнешь то?

firestarter ★★★☆ ()
Ответ на: комментарий от firestarter

Но каким образом ты оглохнешь то?

Запустишь порнушку в mplayer'е, а там общая громкость высокая будет. И как заорет у тебя гимн private ☺

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от router

Насколько я помню, будут ошибки из-за пробелов в именах файлов. Следующий вариант попробую вечером, спасибо.

firestarter ★★★☆ ()
Ответ на: комментарий от geekless

Про process substitution я как-то забыл. Наверное прокатит, спасибо. Попробую вечером.

firestarter ★★★☆ ()
Ответ на: комментарий от firestarter

а как быть с ffplay

Видимо, никак. Вопросы о такой проблеме гуглятся, а вот решения - нет.

geekless ★★ ()
Ответ на: комментарий от Eddy_Em

Запустишь порнушку в mplayer'е, а там общая громкость высокая будет. И как заорет у тебя гимн private ☺

В плеерах нет общей громкости. Она выставляется в одном месте - в микшере алсы. С какой стати она будет выставлена очень громко?

firestarter ★★★☆ ()
Ответ на: комментарий от firestarter

В плеерах нет общей громкости

Смотря как настроишь! Ты можешь настроить softvol, тогда у каждого плеера будет индивидуальная громкость, а можешь — hwvol.

В любом случае, если у тебя 100% громкость в плеере, то ты можешь напороться на "громкий файл".

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

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

firestarter ★★★☆ ()
Ответ на: комментарий от firestarter

А вот с ffplay почему-то нет.

А ffplay вобще можно вызвать из цикла, без read, допустим

for i in file1 file2 file3 ; do ffplay $i ; done

Или он и в этом случае не работает?

А вот это не совсем понял.

Я не совсем корректно сформулировал мысль. Сначала создаём файл-fifo через ″mkfifo MYFIFO″, потом запускаем ls в фоне ″ls -l > MYFIFO″, а уже потом ″exec 3<MYFIFO″ и ″read -u 3″.

Или ещё можно попробовать через coproc http://wiki.bash-hackers.org/syntax/keywords/coproc .

Правда, в обоих случаях как-то придётся позаботится об «отстреле» ″ls″, когда цикл ″while read″ будет прерван. Зато в цикле ″while read″ все 3 стандарных дескриптора будут смотреть на терминал.

mky ★★★★★ ()
Ответ на: комментарий от mky

А ffplay вобще можно вызвать из цикла, без read, допустим
for i in file1 file2 file3 ; do ffplay $i ; done

Подобное спотыкается на файлах с пробелами.

firestarter ★★★☆ ()
Ответ на: комментарий от router

Также см. find ./ -type f -print0 | xargs -0 mplayer

Тут и mplayer, и ffplay ведут себя точно также как и в примерах из первого поста. Вот интересно почему так, судя по всему на stdin плееров тут что-то попадает из pipeline.

firestarter ★★★☆ ()
Ответ на: комментарий от firestarter

Про файлы с пробелами понятно.

Возьмите файлы без пробелов для проверки поведения ffplay, может он в любом разе не будет работать из цикла или не будет завершать воспроизведение по окончании файла.

Хотя мне проще поставить себе ffmpeg и проверить это самому :-)

mky ★★★★★ ()
Ответ на: комментарий от mky

С ffplay я что-то затупил, оказывается он не завершает воспроизведение даже если им просто воспроизвести один файл без всяких циклов (просто команда ffplay file.mp3 или любой формат, в т.ч. видео). Вчера ж специально проверял, показалось что проблема только при использовании из цикла :-\

firestarter ★★★☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.