Error[8]: Undefined offset: 799, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

  1. 亲测发现Python Playsound库在Windows 10、Python 3环境上无法直接使用(2022年5月1日);
  2. 修改playsound.py为如下所示:
import logging
logger = logging.getLogger(__name__)

class PlaysoundException(Exception):
    pass

def _canonicalizePath(path):
    """
    Support passing in a pathlib.Path-like object by converting to str.
    """
    import sys
    if sys.version_info[0] >= 3:
        return str(path)
    else:
        # On earlier Python versions, str is a byte string, so attempting to
        # convert a unicode string to str will fail. Leave it alone in this case.
        return path

def _playsoundWin(sound, block = True):
    '''
    Utilizes windll.winmm. Tested and known to work with MP3 and WAVE on
    Windows 7 with Python 2.7. Probably works with more file formats.
    Probably works on Windows XP thru Windows 10. Probably works with all
    versions of Python.

    Inspired by (but not copied from) Michael Gundlach 's mp3play:
    https://github.com/michaelgundlach/mp3play

    I never would have tried using windll.winmm without seeing his code.
    '''
    sound = _canonicalizePath(sound)

    if any((c in sound for c in ' "\'()')):
        from os       import close, remove
        from os.path  import splitext
        from shutil   import copy
        from tempfile import mkstemp
        
        fd, tempPath = mkstemp(prefix = 'PS', suffix = splitext(sound)[1])  # Avoid generating files longer than 8.3 characters.
        logger.info('Made a temporary copy of {} at {} - use other filenames with only safe characters to avoid this.'.format(sound, tempPath))
        copy(sound, tempPath)
        close(fd)  # mkstemp opens the file, but it must be closed before MCI can open it.
        try:
            _playsoundWin(tempPath, block)
        finally:
            remove(tempPath)
        return

    from ctypes import c_buffer, windll
    from time   import sleep

    def winCommand(*command):
        bufLen = 600
        buf = c_buffer(bufLen)
        # command = ' '.join(command).encode('utf-16')
        command = ' '.join(command) # 修改后
        errorCode = int(windll.winmm.mciSendStringW(command, buf, bufLen - 1, 0))  # use widestring version of the function
        if errorCode:
            errorBuffer = c_buffer(bufLen)
            windll.winmm.mciGetErrorStringW(errorCode, errorBuffer, bufLen - 1)  # use widestring version of the function
            exceptionMessage = ('\n    Error ' + str(errorCode) + ' for command:'
                                '\n        ' + command.decode('utf-16') +
                                '\n    ' + errorBuffer.raw.decode('utf-16').rstrip(')').
            logger(error)exceptionMessageraise
            ( PlaysoundException)exceptionMessagereturn
        . bufifvalue

    '\' in : sound=
        sound '"' + + sound '"' try

    :.
        logger(debug'Starting')(
        winCommandu'open {}'.format()sound)(
        winCommandu'play {}{}'.format(,sound' wait' if else block '' )).
        logger(debug'Returning')finally
    :try
        :(
            winCommandu'close {}'.format()sound)except
        : PlaysoundException.
            logger(warningu'Failed to close the file: {}'.format()sound)# If it fails, there's nothing more that can be done...
            pass
            def

_handlePathOSX ()sound:=
    sound ( _canonicalizePath)soundif

    '://' not in : soundif
        not . sound(startswith'/'):from
            import os = getcwd
            sound ( getcwd)+ '/' + = sound
        sound 'file://' + try sound

    :# Don't double-encode it.
        .
        sound(encode'ascii')return
        . sound(replace' ','%20' )except
    : UnicodeEncodeErrortry
        :from
            . urllibimportparse # Try the Python 3 import first... quote  except
        : ImportErrorfrom
            import urllib # Try using the Python 2 import before giving up entirely... quote  =

        parts . sound(split'://',1 )return
        [ parts0]+ '://' + ( quote[parts1].(encode'utf-8')).(replace' ','%20' )def


_playsoundOSX (,sound= block True ):'''
    Utilizes AppKit.NSSound. Tested and known to work with MP3 and WAVE on
    OS X 10.11 with Python 2.7. Probably works with anything QuickTime supports.
    Probably works on OS X 10.5 and newer. Probably works with all versions of
    Python.

    Inspired by (but not copied from) Aaron's Stack Overflow answer here:
    http://stackoverflow.com/a/34568298/901641

    I never would have tried using AppKit.NSSound without seeing his code.
    '''
    try
    :from
        import AppKit except NSSound
    : ImportError.
        logger(warning"playsound could not find a copy of AppKit - falling back to using macOS's system copy.").
        sys.path(append'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC')from
        import AppKit from NSSound

    import Foundation from NSURL
    import time       = sleep

    sound ( _handlePathOSX)sound=
    url   . NSURL(URLWithString_)soundif
    not : urlraise
        ( PlaysoundException'Cannot find a sound with filename: '+ ) soundfor

    in i range (5):=
        nssound . NSSound(alloc).(initWithContentsOfURL_byReference_,urlTrue )if
        : nssoundbreak
            else
        :.
            logger(debug'Failed to load sound, although url was good... '+ ) soundelse
    :raise
        ( PlaysoundException'Could not load sound with filename, although URL was good... '+ ) sound.
    nssound(play)if

    : block(
        sleep.nssound(duration))def

_playsoundNix (,sound= block True ):"""Play a sound using GStreamer.

    Inspired by this:
    https://gstreamer.freedesktop.org/documentation/tutorials/playback/playbin-usage.html
    """
    =
    sound ( _canonicalizePath)sound# pathname2url escapes non-URL-safe characters

    from
    . osimportpath , abspathtry exists
    :from
        . urllibimportrequest except pathname2url
    : ImportError# python 2
        from
        import urllib import pathname2url

    . gi
    gi(require_version'Gst','1.0' )from
    . giimportrepository . Gst

    Gst(initNone)=

    playbin . Gst.ElementFactory(make'playbin','playbin' )if
    . sound(startswith('http://','https://' )):.
        playbin.props=uri else sound
    :=
        path ( abspath)soundif
        not ( exists)path:raise
            ( PlaysoundExceptionu'File not found: {}'.format()path).
        playbin.props=uri 'file://' + ( pathname2url)path=


    set_result . playbin(set_state.Gst.State)PLAYINGif
    != set_result . Gst.StateChangeReturn:ASYNCraise
        ( PlaysoundException"playbin.set_state returned "
            + repr ()set_result)# FIXME: use some other bus method than poll() with block=False

    # https://lazka.github.io/pgi-docs/#Gst-1.0/classes/Bus.html
    .
    logger(debug'Starting play')if
    : block=
        bus . playbin(get_bus)try
        :.
            bus(poll.Gst.MessageType,EOS. Gst)CLOCK_TIME_NONEfinally
        :.
            playbin(set_state.Gst.State)NULL.
            
    logger(debug'Finishing play')def

_playsoundAnotherPython (,otherPython, sound= block True ,= macOS False ):'''
    Mostly written so that when this is run on python3 on macOS, it can invoke
    python2 on macOS... but maybe this idea could be useful on linux, too.
    '''
    from
    import inspect    from getsourcefile
    . osimportpath    , abspathfrom exists
    import subprocess from check_call
    import threading  = Thread

    sound ( _canonicalizePath)soundclass

    PropogatingThread ()Thread:def
        run ()self:.
            self=exc None try
            :.
                self=ret . self(_target*.self,_args** .self)_kwargsexcept
            as BaseException : e.
                self=exc def e

        join (,self= timeout None ):super
            ().(join)timeoutif
            . self:excraise
                . selfreturnexc
            . self# Check if the file exists...ret

    if
    not ( exists(abspath)sound):raise
        ( PlaysoundException'Cannot find a sound with filename: '+ ) sound=

    playsoundPath ( abspath(getsourcefilelambda:0 ))=
    t ( PropogatingThread=target lambda :( check_call[,otherPython, playsoundPath( _handlePathOSX)soundif else macOS ] sound)).
    t(start)if
    : block.
        t(join)from

import platform = system
system ( system)if

== system 'Windows' :=
    playsound elif _playsoundWin
== system 'Darwin' :=
    playsound import _playsoundOSX
    if sys
    . sys[version_info0]2 > :try
        :from
            import AppKit except NSSound
        : ImportError.
            logger(warning"playsound is relying on a python 2 subprocess. Please use `pip3 install PyObjC` if you want playsound to run more efficiently.")=
            playsound lambda , sound= block True :( _playsoundAnotherPython'/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python',, sound, block= macOS True )else
:=
    playsound if _playsoundNix
    != __name__ '__main__' :# Ensure we don't infinitely recurse trying to get another python instance.  try
        :import
            . gi
            gi(require_version'Gst','1.0' )from
            . giimportrepository except Gst
        :.
            logger(warning"playsound is relying on another python subprocess. Please use `pip install pygobject` if you want playsound to run more efficiently.")=
            playsound lambda , sound= block True :( _playsoundAnotherPython'/usr/bin/python3',, sound, block= macOS False )del

if system

== __name__ '__main__' :# block is always True if you choose to run this from the command line.
    from
    import sys ( argv
    playsound[argv1])from

  1. 上方脚本已经是修改之后的最终版本,期中的修改的位置如下图所示:

  2. 然后采用下方代码直接运行即可:

import playsound ( playsound  
playsound'D:/PyTimer/test.mp3')python main.py
  1. 执行playsound 如果美妆pip install, 则只需要[+++]一下即可。



作者:艾孜尔江

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Python Playsound用法_python_内存溢出

Python Playsound用法

Python Playsound用法,第1张

  1. 亲测发现Python Playsound库在Windows 10、Python 3环境上无法直接使用(2022年5月1日);
  2. 修改playsound.py为如下所示:
import logging
logger = logging.getLogger(__name__)

class PlaysoundException(Exception):
    pass

def _canonicalizePath(path):
    """
    Support passing in a pathlib.Path-like object by converting to str.
    """
    import sys
    if sys.version_info[0] >= 3:
        return str(path)
    else:
        # On earlier Python versions, str is a byte string, so attempting to
        # convert a unicode string to str will fail. Leave it alone in this case.
        return path

def _playsoundWin(sound, block = True):
    '''
    Utilizes windll.winmm. Tested and known to work with MP3 and WAVE on
    Windows 7 with Python 2.7. Probably works with more file formats.
    Probably works on Windows XP thru Windows 10. Probably works with all
    versions of Python.

    Inspired by (but not copied from) Michael Gundlach 's mp3play:
    https://github.com/michaelgundlach/mp3play

    I never would have tried using windll.winmm without seeing his code.
    '''
    sound = _canonicalizePath(sound)

    if any((c in sound for c in ' "\'()')):
        from os       import close, remove
        from os.path  import splitext
        from shutil   import copy
        from tempfile import mkstemp
        
        fd, tempPath = mkstemp(prefix = 'PS', suffix = splitext(sound)[1])  # Avoid generating files longer than 8.3 characters.
        logger.info('Made a temporary copy of {} at {} - use other filenames with only safe characters to avoid this.'.format(sound, tempPath))
        copy(sound, tempPath)
        close(fd)  # mkstemp opens the file, but it must be closed before MCI can open it.
        try:
            _playsoundWin(tempPath, block)
        finally:
            remove(tempPath)
        return

    from ctypes import c_buffer, windll
    from time   import sleep

    def winCommand(*command):
        bufLen = 600
        buf = c_buffer(bufLen)
        # command = ' '.join(command).encode('utf-16')
        command = ' '.join(command) # 修改后
        errorCode = int(windll.winmm.mciSendStringW(command, buf, bufLen - 1, 0))  # use widestring version of the function
        if errorCode:
            errorBuffer = c_buffer(bufLen)
            windll.winmm.mciGetErrorStringW(errorCode, errorBuffer, bufLen - 1)  # use widestring version of the function
            exceptionMessage = ('\n    Error ' + str(errorCode) + ' for command:'
                                '\n        ' + command.decode('utf-16') +
                                '\n    ' + errorBuffer.raw.decode('utf-16').rstrip(')').
            logger(error)exceptionMessageraise
            ( PlaysoundException)exceptionMessagereturn
        . bufifvalue

    '\' in : sound=
        sound '"' + + sound '"' try

    :.
        logger(debug'Starting')(
        winCommandu'open {}'.format()sound)(
        winCommandu'play {}{}'.format(,sound' wait' if else block '' )).
        logger(debug'Returning')finally
    :try
        :(
            winCommandu'close {}'.format()sound)except
        : PlaysoundException.
            logger(warningu'Failed to close the file: {}'.format()sound)# If it fails, there's nothing more that can be done...
            pass
            def

_handlePathOSX ()sound:=
    sound ( _canonicalizePath)soundif

    '://' not in : soundif
        not . sound(startswith'/'):from
            import os = getcwd
            sound ( getcwd)+ '/' + = sound
        sound 'file://' + try sound

    :# Don't double-encode it.
        .
        sound(encode'ascii')return
        . sound(replace' ','%20' )except
    : UnicodeEncodeErrortry
        :from
            . urllibimportparse # Try the Python 3 import first... quote  except
        : ImportErrorfrom
            import urllib # Try using the Python 2 import before giving up entirely... quote  =

        parts . sound(split'://',1 )return
        [ parts0]+ '://' + ( quote[parts1].(encode'utf-8')).(replace' ','%20' )def


_playsoundOSX (,sound= block True ):'''
    Utilizes AppKit.NSSound. Tested and known to work with MP3 and WAVE on
    OS X 10.11 with Python 2.7. Probably works with anything QuickTime supports.
    Probably works on OS X 10.5 and newer. Probably works with all versions of
    Python.

    Inspired by (but not copied from) Aaron's Stack Overflow answer here:
    http://stackoverflow.com/a/34568298/901641

    I never would have tried using AppKit.NSSound without seeing his code.
    '''
    try
    :from
        import AppKit except NSSound
    : ImportError.
        logger(warning"playsound could not find a copy of AppKit - falling back to using macOS's system copy.").
        sys.path(append'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC')from
        import AppKit from NSSound

    import Foundation from NSURL
    import time       = sleep

    sound ( _handlePathOSX)sound=
    url   . NSURL(URLWithString_)soundif
    not : urlraise
        ( PlaysoundException'Cannot find a sound with filename: '+ ) soundfor

    in i range (5):=
        nssound . NSSound(alloc).(initWithContentsOfURL_byReference_,urlTrue )if
        : nssoundbreak
            else
        :.
            logger(debug'Failed to load sound, although url was good... '+ ) soundelse
    :raise
        ( PlaysoundException'Could not load sound with filename, although URL was good... '+ ) sound.
    nssound(play)if

    : block(
        sleep.nssound(duration))def

_playsoundNix (,sound= block True ):"""Play a sound using GStreamer.

    Inspired by this:
    https://gstreamer.freedesktop.org/documentation/tutorials/playback/playbin-usage.html
    """
    =
    sound ( _canonicalizePath)sound# pathname2url escapes non-URL-safe characters

    from
    . osimportpath , abspathtry exists
    :from
        . urllibimportrequest except pathname2url
    : ImportError# python 2
        from
        import urllib import pathname2url

    . gi
    gi(require_version'Gst','1.0' )from
    . giimportrepository . Gst

    Gst(initNone)=

    playbin . Gst.ElementFactory(make'playbin','playbin' )if
    . sound(startswith('http://','https://' )):.
        playbin.props=uri else sound
    :=
        path ( abspath)soundif
        not ( exists)path:raise
            ( PlaysoundExceptionu'File not found: {}'.format()path).
        playbin.props=uri 'file://' + ( pathname2url)path=


    set_result . playbin(set_state.Gst.State)PLAYINGif
    != set_result . Gst.StateChangeReturn:ASYNCraise
        ( PlaysoundException"playbin.set_state returned "
            + repr ()set_result)# FIXME: use some other bus method than poll() with block=False

    # https://lazka.github.io/pgi-docs/#Gst-1.0/classes/Bus.html
    .
    logger(debug'Starting play')if
    : block=
        bus . playbin(get_bus)try
        :.
            bus(poll.Gst.MessageType,EOS. Gst)CLOCK_TIME_NONEfinally
        :.
            playbin(set_state.Gst.State)NULL.
            
    logger(debug'Finishing play')def

_playsoundAnotherPython (,otherPython, sound= block True ,= macOS False ):'''
    Mostly written so that when this is run on python3 on macOS, it can invoke
    python2 on macOS... but maybe this idea could be useful on linux, too.
    '''
    from
    import inspect    from getsourcefile
    . osimportpath    , abspathfrom exists
    import subprocess from check_call
    import threading  = Thread

    sound ( _canonicalizePath)soundclass

    PropogatingThread ()Thread:def
        run ()self:.
            self=exc None try
            :.
                self=ret . self(_target*.self,_args** .self)_kwargsexcept
            as BaseException : e.
                self=exc def e

        join (,self= timeout None ):super
            ().(join)timeoutif
            . self:excraise
                . selfreturnexc
            . self# Check if the file exists...ret

    if
    not ( exists(abspath)sound):raise
        ( PlaysoundException'Cannot find a sound with filename: '+ ) sound=

    playsoundPath ( abspath(getsourcefilelambda:0 ))=
    t ( PropogatingThread=target lambda :( check_call[,otherPython, playsoundPath( _handlePathOSX)soundif else macOS ] sound)).
    t(start)if
    : block.
        t(join)from

import platform = system
system ( system)if

== system 'Windows' :=
    playsound elif _playsoundWin
== system 'Darwin' :=
    playsound import _playsoundOSX
    if sys
    . sys[version_info0]2 > :try
        :from
            import AppKit except NSSound
        : ImportError.
            logger(warning"playsound is relying on a python 2 subprocess. Please use `pip3 install PyObjC` if you want playsound to run more efficiently.")=
            playsound lambda , sound= block True :( _playsoundAnotherPython'/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python',, sound, block= macOS True )else
:=
    playsound if _playsoundNix
    != __name__ '__main__' :# Ensure we don't infinitely recurse trying to get another python instance.  try
        :import
            . gi
            gi(require_version'Gst','1.0' )from
            . giimportrepository except Gst
        :.
            logger(warning"playsound is relying on another python subprocess. Please use `pip install pygobject` if you want playsound to run more efficiently.")=
            playsound lambda , sound= block True :( _playsoundAnotherPython'/usr/bin/python3',, sound, block= macOS False )del

if system

== __name__ '__main__' :# block is always True if you choose to run this from the command line.
    from
    import sys ( argv
    playsound[argv1])from

  1. 上方脚本已经是修改之后的最终版本,期中的修改的位置如下图所示:

  2. 然后采用下方代码直接运行即可:

import playsound ( playsound  
playsound'D:/PyTimer/test.mp3')python main.py
  1. 执行playsound 如果美妆pip install, 则只需要一下即可。



作者:艾孜尔江

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/798439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存