Как отключить звук во флешплеере в моем пользовательском приложении?

Я использую компонент Qt QWebView, который использует flash-плеер для воспроизведения видео. Как отключить звук во флеш-плеере, запущенном внутри моего QWebView?

Один из подходов, который я рассматриваю, состоит в том, чтобы выполнить некоторый код javascript для отключения звука в плеере, но когда его выполнять? Например, следующий код отключает звук, если запустить его через 1 секунду после вызова «загрузить»:

page.mainFrame().evaluateJavaScript("""
    var mute_all_tags=function(tag){
        var elems = document.getElementsByTagName(tag);
        for(var i = 0; i < elems.length; i++){
            elems[i].muted=true;
            //alert(elems[i]);
        }
    }
    mute_all_tags("video");
    mute_all_tags("audio");
""")

При более ранних вызовах звук не прерывается. Вызовы QWebView.loadFinished останавливают звук, но на этот момент какой-то звук уже издается, как я могу немедленно остановить звук?


person Ivan Borshchov    schedule 31.03.2015    source источник
comment
Какой HTML находится в WebView? Сначала вы говорите, что это flashplayer, а затем ссылаетесь на теги <audio>/<video>.   -  person wavemode    schedule 09.04.2015
comment
например видео с ютуба.   -  person Ivan Borshchov    schedule 09.04.2015
comment
Вы контролируете отображаемый HTML-код или это третья сторона, как со страницы YouTube?   -  person Drakes    schedule 09.04.2015


Ответы (2)


Похоже, вы загружаете внешние страницы (например, сторонние сайты) с видео HTML5 или Flash-видео в свой QWebView. Кроме того, сохранение звука в видео с самого начала без звука кажется важной функцией, которую вы ищете.

Решение 1

Ваш page.mainFrame().evaluateJavaScript("...") кажется самым простым решением, но перед выполнением этого скрипта будет задержка.

Решение 2

В качестве альтернативы можно очистить целевой веб-сайт, а затем с помощью регулярного выражения или чего-то подобного изменить все теги <video>, чтобы добавить свойство отключения звука, например. <video controls muted>. Сделайте что-то подобное и для любых тегов <embed>. Затем загрузите этот измененный HTML-код в веб-представление с помощью метода setHtml(), также задав базовый URL-адрес и, возможно, заголовок реферера. Затем HTML будет отображаться с отключенным звуком ваших видео с самого начала.

Решение 3

Другая идея может состоять в том, чтобы перехватывать URL-адреса мультимедиа с помощью самого Qt (например, .mp4, .mov) и первоначально удерживать их в очереди с паузой, вызывать ваш page.mainFrame().evaluateJavaScript("...") для программного отключения тегов <video> и <audio>, а затем разрешить очередь продолжить работу, когда evaluateJavaScript() звонок возвращается. Медиафайлы, если они воспроизводятся автоматически, должны начинаться без звука.

person Drakes    schedule 09.04.2015

Пожалуйста, исправьте свой код следующим образом:

page.mainFrame().evaluateJavaScript("var mute_all_tags=function(tag){var elems = document.getElementsByTagName(tag);for(var i = 0; i < elems.length; i++){elems[i].muted=true;}}mute_all_tags('video');mute_all_tags('audio');")

Строка в вашем коде недействительна:

  1. Вы добавляете двойные кавычки в строку без объединения .

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

person ProllyGeek    schedule 09.04.2015
comment
Как насчет задержки перед отключением видео? Как он может это решить? - person Drakes; 09.04.2015
comment
мой код работает, когда я его вызываю, и я упомянул об этом. Вопрос был - когда звонить. Это Python, и тройные кавычки делают то, что мне нужно. - person Ivan Borshchov; 09.04.2015
comment
извините, я не очень хорошо понял вопрос, однако я вижу, что вы нашли то, что искали, удачи :), хотя я не знаю, как ваш код работает без конкатенации, даже если это python. - person ProllyGeek; 09.04.2015