LINUX.ORG.RU

Создать GUI для Mplayer на баше


0

1

Есть ли способ на баше (с помощью чего нибудь типа Kdialog) создать GUI для Mplayer? С помощью ключа -wid у mplayer я могу встроить mplayer в любое окно, но оно заполняет всё окно (пример), а хотелось бы чтобы внизу были кнопки, которые будут всегда доступны.

Нужно что-то типа фрейма со своим windowid в окне, видимо. В крайнем случае сойдёт питон. Есть ли возможность создать в окне фрейм со своим windowid, который можно будет передать мплееру в параметре -wid?

Зачем? Просто хочу создать интерфейс для плеера некоторых онлайн потоков с возможностью быстрого начала записи нажатием одной кнопки в окне в нужный момент. Сами потоки не воспроизводятся с помощью mplayer, их получает rtmpdump и затем поток перенаправляется в mplayer. При нажатии кнопки записи между mplayer и rtmpdump вставляется tee, обеспечивающий одновременно запись и просмотр. Это уже реализовано в скрипте, для записи нужно запускать с ключём -rec, но это неудобно, хотелось бы просто нажатием кнопки в окне при просмотре, как в VLC.

★★★☆

Последнее исправление: firestarter (всего исправлений: 2)

Блин, возьми smplayer и подсунь ему вместо mplayer'а свой скрипт, в котором реализуй то, что тебе нужно. Не изобретай велосипед, просто допиши то, что тебе нужно.

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

Блин, возьми smplayer и подсунь ему вместо mplayer'а свой скрипт, в котором реализуй то, что тебе нужно. Не изобретай велосипед, просто допиши то, что тебе нужно.

Ты ничего не понял. Засовывание скрипта в smplayer не добавит возможности нажатием одной кнопки в окне smplayer менять этот самый скрипт (добавить ключ к нему хотя бы).

firestarter ★★★☆
() автор топика

Наверное frame в Tkinter то что нужно, потом поковыряюсь...

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

Ты ничего не понял

Все я понял. Я просто дал тебе направление, предоставляя конкрентую идею тебе.

Ладно, вот пару вариантов:

Вариант 1. Делаешь плейлист из двух треков: track и track-record. Скармливаешь плейлист SMplayer'у. Вместо mplayer подсовываешь свой скрипт-обертку. Скрипт-обертка парсит имя трека. Если вконце есть "-record" делает mplayer через tee (ну, и обрезает этот суффикс); если нет - прозрачно транслирует все параметры в mplayer. Переключение режимов записи - это переключение треков в SMplayer.

Вариант 2. Если ты программишь, то должен догадываться, что tee - примитивнейшая программа. И, в первом приближении, ее написать на C/C++ - минут 5. Но ты можешь добавить функционал, что она имеет 2 режима: зеркалит поток или нет. Переключение - варианты ограничены только фантазией: по сигналу процессу (с помощью kill -HUP ), слушает TCP порт (тогда нужна программа-клиент), мониторит наличие файла (можно периодически опросом или с помощью libinotify)? да хоть сделай ее GUI'шной - одно окно с кнопкой «Запись»! Все! Скармливай комбинацию | tee | mplayer SMplayer'у и будет тебе счастье. P. S. Думаю в tee есть свои ньюансы (например с размером буффера), так что можешь посмореть исходники tee - мы ведь в OpenSource мире.

Еще варианты можешь сам придумать.

В любом случае это намного проще чем писать плеер с нуля.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)

В питоне + Tk — запросто, каждый виджет Tk имеет свой windowid и является полноценным окном для иксов. Можно сделать мелкую программу на чём угодно, делающую подобное, и дёргать её из баша.

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

Да, работает, уже попробовал в ipython создать окно с frame и запустив из консоли mplayer, приаттачить его к этому фрейму. Вот только mplayer так не реагирует на нажатие горячих клавиш. Не подскажешь как сделать?

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

Instead of intercepting keyboard events, MPlayer will read commands separated by a newline (\n) from stdin.

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

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

Можно тупо крутить цикл, ловящий эвенты в питоноокне, и пересылать все события от клавиатуры в окно mplayer (т.е. тебе нужно будет знать window id его окна, но это не слишком сложно). Это стандартные проблемы reparenting'а.

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

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

Homura_Akemi
()

Вот же делать не хрен!

На кой черт mplayer'у морда? Он и так — отличный плеер. А морда сделает из него говнище.

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

Ты не прочитал последний абзац. Там не только mplayer, до него идет rtmpdump. А при нажатии кнопки в окне этого gui между ними будет вставляться ещё и tee.

firestarter ★★★☆
() автор топика

Просто хочу создать интерфейс для плеера некоторых онлайн потоков с возможностью быстрого начала записи нажатием одной кнопки в окне в нужный момент. Сами потоки не воспроизводятся с помощью mplayer, их получает rtmpdump и затем поток перенаправляется в mplayer. При нажатии кнопки записи между mplayer и rtmpdump вставляется tee, обеспечивающий одновременно запись и просмотр.

У записанного файла разве нет заголовка? В смысле, поток можно играть с середины файла с любого места? А границы фреймов? Или скрипт будет сам генерировать заголовок, анализировать поток и начинать запись на границе фрейма?

В смысле, такая «запись нажатием одной кнопки» вообще работать будет?

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

Ну в скрипте работает. Там так (для краткости без параметров):

mplayer <(
    rtmpdump -r rtmp://example.com/app/playpath
)

В смысле, такая «запись нажатием одной кнопки» вообще работать будет?

При нажатии кнопки работа фонового плеера будет завершаться и перезапускаться с другими параметрами и аттачиться снова в этот гуй.

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

При нажатии кнопки работа фонового плеера будет завершаться и перезапускаться с другими параметрами и аттачиться снова в этот гуй.

rtmpdump тоже будет перезапускаться?

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

Ага. А он в любом случае завершится, т.к. pipe закроется.

Тогда «быстрое начало записи» будет не таким уж и быстрым.

Но зато можно схитрить.

Хоткеи в mplayer-е можно назначать на разные действия. Список действий можно увидеть в `mplayer -input cmdlist`, и среди этих действий есть запуск внешней команды или скрипта (run), который тоже можно назначить на любую кнопку. Например, чтобы назначить запуск команды на кнопку R надо вписать в ~/.mplayer/input.conf строку:

r run «/path/to/your/script.sh param1 param2 param3 ...»
Вместо кнопки клавиатуры можно вписать, например, правую кнопку мыши (MOUSE_BTN2, полный список смотреть в `mplayer -input keylist`).

А запускаемый таким образом скрипт может прибить текущий mplayer и запустить новый в режиме записи. ☺ И переключение можно сделать по левой/правой/средней кнопке мыши или по любой кнопке на клавиатуре.

Такой вариант сойдет?

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

Но зато можно схитрить.

А смысл? Всё равно ведь результат тот же, прибиение текущего mplayer и запуск нового. Да и большую часть задержки в данном случае всё равно вносит rtmpdump, который тоже приходится перезапускать, чтобы вставить tee между ним и mplayer.

Хм, а впрочем, может и хорошая идея, у mplayer же есть какие то ключи -capture и -dumpstream, наверное можно таким образом повесить на горячую клавишу добавление этих ключей без перезапуска даже. В таком случае может и GUI делать не понадобится вовсе: If this option is given, capturing can be started and stopped by pressing the key bound to this function (see section INTERACTIVE CONTROL).

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

В таком случае может и GUI делать не понадобится вовсе: If this option is given, capturing can be started and stopped by pressing the key bound to this function (see section INTERACTIVE CONTROL).

Хрен там, -capture бесполезная фигня, она дампит сырой поток без заголовков, который ничто не понимает, в т.ч. ffmpeg.

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

А смысл? Всё равно ведь результат тот же, прибиение текущего mplayer и запуск нового.

Зато можно избавиться от GUI, -wid, и не морочить себе голову с приклеиванием кнопочек. Исходную задачу получится решить используя только баш.

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