LINUX.ORG.RU

Flash/HTML 5 видео в отдельном окне.

 , , ,


2

3

Давно хотел сделать вывод видео из google chrome в отдельном окне (без рамки, простым оверлеем без всяких MPV на основе превьюшек (thumbnails)).

Решил совместить приятное с полезным и за одно посмотнреть на QML. Такчто можно сказать получился «Hello World» на QML. Решил выложить (может кому пригодится - можно применять не только к браузерам а к любому софту хоть к консоли).

Как пользоватся:

Открываем страницу с нужным видео (youtube, twitch и тд) в отдельном окне браузера и затаскиваем его на виртуальный десктоп «для хлама».
Запускаем «thumb.sh» появляется курсор выбора окна (xwininfo).
Кликаем по окну браузера и ждем запуска основного приложения.
Появляется синий полупрозрачный прямоугольник который нужно расположить точно поверх видео (помогает зажатый Alt + левая / правая кнопка мыши).
После того как оверлей выравнен по видео нажимаем кнопку 'lock' (или дабл клик мыши по оверлею).
Далее распологаем наш фрагмент окна в желаемой позиции монитора (дабл клик переключает между большим и малым размером).

thumb.sh

#!/bin/bash

cd `dirname "$0"`

lines=`xwininfo|tr -d ' ' | tr '":' ' '`

dstVar=""
for line in $lines; do
        if [ ! -z "${dstVar}" ]; then
                eval "${dstVar}=${line}"
                dstVar=""
        fi

        case "${line}" in
                'Windowid') dstVar='id'     ;;
                'Width'   ) dstVar='width'  ;;
                'Height'  ) dstVar='height' ;;
                'Absoluteupper-leftX' ) dstVar='left' ;;
                'Absoluteupper-leftY' ) dstVar='top' ;;

                * ) ;;
        esac
done

exec qml thumb.qml -- ${id} ${left} ${top} ${width} ${height}

thumb.qml

import QtQuick 2.2                                                                                                                                          
import QtQuick.Window 2.2                                                                                                                                   
import QtQuick.Controls 1.4                                                                                                                                 
                                                                                                                                                            
import org.kde.plasma.core 2.0 as PlasmaCore                                                                                                                
                                                                                                                                                             
Window
{
        id: wnd
        visible: true
        width: 320
        height: 160

        title: 'Thumb'

        color: 'blue'
        opacity: 0.5
        flags: Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint

        property var isLocked: false
        property var maxWidth: 0;
        property var minWidth: 0;
        property var isMax: false;

        property var src:
        ({
                x: parseInt(Qt.application.arguments[4]),
                y: parseInt(Qt.application.arguments[5]),
                w: parseInt(Qt.application.arguments[6]),
                h: parseInt(Qt.application.arguments[7])
        })

        property var crop:
        ({
                x: 0,
                y: 0,
                w: parseInt(Qt.application.arguments[6]),
                h: parseInt(Qt.application.arguments[7])
        })

        function lock()
        {
                wnd.opacity     = 1.0;
                wnd.isLocked    = true;
                lockBtn.visible = false;
                thumb.visible   = true;
                wnd.maxWidth    = crop.w;
                wnd.minWidth    = crop.w;

                console.log('Locked !');
        }

        function togleMinMax()
        {
                var nw, nh;

                if( wnd.isMax )
                {
                        nw = wnd.minWidth;
                        wnd.maxWidth = wnd.width;
                        wnd.isMax    = false;
                }
                else
                {
                        nw = wnd.maxWidth;
                        wnd.minWidth = wnd.width;
                        wnd.isMax = true;
                }

                nh = ((nw * crop.h) / crop.w);
                wnd.x -= (nw - wnd.width);
                wnd.y -= (nh - wnd.height);
                wnd.width  = nw;
                wnd.height = nh;
        }

        function fixThumb()
        {
                if( wnd.isLocked )
                {
                        var sf = wnd.width / crop.w;
                        console.log('Scale factor: ' + sf);

                        thumb.x      = -(crop.x * sf);
                        thumb.y      = -(crop.y * sf);
                        thumb.width  = src.w * sf;
                        thumb.height = src.h * sf;
                }
                else
                {
                        crop.x = (wnd.x - src.x);
                        crop.y = (wnd.y - src.y);
                        crop.w = wnd.width;
                        crop.h = wnd.height;

                        thumb.x = - crop.x;
                        thumb.y = - crop.y;
                }
        }

        onXChanged:      { if(! wnd.isLocked) fixThumb(); }
        onYChanged:      { if(! wnd.isLocked) fixThumb(); }
        onHeightChanged: { fixThumb(); }
        onWidthChanged:  { fixThumb(); }

        PlasmaCore.WindowThumbnail {
                id: thumb
                visible: false;

                x: 0
                y: 0
                width:  parseInt(Qt.application.arguments[6])
                height: parseInt(Qt.application.arguments[7])

                winId: parseInt(Qt.application.arguments[3])
        }

        MouseArea
        {
                anchors.fill: parent

                onDoubleClicked:
                {
                        if( wnd.isLocked )
                        {
                                wnd.togleMinMax();
                        }
                        else
                        {
                                wnd.lock();
                        }
                }
        }

        Button
        {
                id: lockBtn

                anchors.top:   parent.top
                anchors.right: parent.right

                text: 'lock'

                onClicked: { wnd.lock(); }
        }
}

PS. На моем KDE 5.6.5 работает, будет ли еще гдето работать - хз

★★★★
Ответ на: комментарий от fornlr

Эээ, это же из коробки есть в Chromium

Не замечал. А как активировать?

fehhner ★★★★★
()

Объясните чайнику, в чем суть? Запускаю видео в браузере, «кусок» браузера с «играющим» в нем видео копируется в отдельное окно? Или как это работает?

alozovskoy ★★★★★
()

без всяких MPV

А смысл тогда в нём? Чтоб на весь экран без требухи было есть f11.

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

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

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

Стало понятнее, спасибо!

Я правильно понимаю что так можно захватить любую информацию, не только видео из хрома? Тот же, скажем, top можно также вывести, я правильно понял?

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

да, любую часть любого окна

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

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

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

Отличная фича. О ней стоит в заглавном сообщении упомянуть.

i-rinat ★★★★★
()
Ответ на: комментарий от zaz

Теперь это окношко куда-нибудь, через VNC.
С видео это бесполезно, но с какой-нибудь прогой можно.

anonymous
()

Может кому пригодится:

ffplay $(youtube-dl -f High --get-url https://www.twitch.tv/esl_sc2) &

Для ютуба тоже можно, но немного сложнее, так как он по умолчанию отдельно выдаёт две ссылки для аудио и для видео. Но для трича самое то. -f High — потому как ffplay не умеет в предзагрузку и с рывками воспроизводит рубленный на куски поток. Возможно ваш любимый плеер умеет делать это лучше, чем ffplay. Если так, то просто уберите -f High и получите качество источника.

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

Можно указывать несколько форматов через слэш, программа будет их искать по очереди (у меня, например, для среднего качества было 18/Medium/Source/best)

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

Присоединяюсь к вопросу, где эта фича спрятана?

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