【问题标题】:freeswitch stream remote audio filefreeswitch 流远程音频文件
【发布时间】:2014-08-24 17:56:20
【问题描述】:

我将远程音频文件保存在谷歌云存储上。 我想在freeswitch中播放这些文件。

当我使用时:

mediaLink = "http://storage.googleapis.com/myBucket/file.wav";
session:streamFile(mediaLink);  

效果很好。

但是当我使用签名网址时

mediaLink = "http://storage.googleapis.com/myBucket/file.wav?GoogleAccessId=xxx-xxx@developer.gserviceaccount.com&Expires=1408903962590&Signature=xxb%2Fx%2FDfGJlrUuz0%2F6kA6ormmReW6oN%2F0xxy3%2BwWxXc%3D";
session:streamFile(mediaLink);

我得到这个错误:

2014-08-24 20:42:48.770818 [ERR] mod_httapi.c:2696 File at url [http://storage.googleapis.com/myBucket/file.wav?GoogleAccessId=xxx-xxx@developer.gserviceaccount.com&Expires=1408903962590&Signature=xxb%2Fx%2FDfGJlrUuz0%2F6kA6ormmReW6oN%2F0xxy3%2BwWxXc%3D] is unreachable!

谢谢, 斯内贝尔

【问题讨论】:

  • 如果您将签名的 URL 粘贴到 Web 浏览器中,您会看到错误吗?你能把那个错误贴在这里吗?
  • 这就是问题所在,签名的 URL 正在浏览器上运行。我可以通过浏览器下载文件。所以我知道链接是有效的。
  • 我尝试删除每个参数以查看导致错误的参数。当我删除此参数时:GoogleAccessId=xxx-xxx@developer.gserviceaccount.com freeswitch 能够下载并播放文件。此参数中是否存在导致 session:streamFile() 失败的字符?我应该转义一些字符吗?如果是这样,哪个以及如何?这个参数是强制性的,所以我不能只是从链接中删除它。任何想法如何解决这个问题?
  • URL 编码解决了这个错误,URLEncoder.encode(url_params, "UTF-8");对 URL 参数进行编码。我得到的网址:URL = storage.googleapis.com/myBucket/file.wav? GoogleAccessId%3D703391026438d3tc85gd1jiu6f32mckumln3b2gc5qhk%40developer.gserviceaccount.com%26%到期%3D1408970638639 26%签字%3DF3zM 2Fkr2mKqulgrdp1F6Q9Gdf5rKvy7GHrWOW5GMU xxxxxxxxxxxXxxxxxxXXXXXXXXjXtFFRBJp4a%2BfhrQJcrs4p%2FZhsSdB kyet8qVwf%2BRUN8I0ROA%2FNpJ%2B0T0eEBqP2PNFPHzI8GKQWm7wI6mmZDwKtgUT3A%2BVXGV74nUqHrNY%3D但现在我得到这个异常:[ERR] mod_httapi.c :2723 检查文件缓存时出错(检查权限)
  • 我知道这有点老了,但这可能与freeswitch如何处理HTTP请求有关。根据此post,Amazon S3 也出现了此问题。有一个建议的解决方法,其中涉及一个补丁来执行 GET 而不是 HEAD,但没有信息是否有效(似乎 S3 的方式有些时髦,可能是 GCS 处理缓存控制)。

标签: google-cloud-storage freeswitch


【解决方案1】:

能够使其在 FreeSWITCH 1.10 上与 mod_dptoolsmod_shoutplayback 一起工作(支持 mp3)。 Google Storage signing algorithm 目前也是 V4。

测试工作流程:

  1. $ gsutil signurl -r us service-account.json gs://the-bucket/a-song.mp3
    
    URL
    gs://the-bucket/a-song.mp3
    
    HTTP Method
    GET
    
    Expiration
    2019-08-24 19:03:02
    
    Signed URL
    https://storage.googleapis.com/the-bucket/a-song.mp3?x-goog-signature=a4d1dc28eeebfcdfd09f00cbc1bbe605590df3773fd473a9bcc961928bd0a64bc9ea6367a7c2de98cb5f397529bd82f455651b1d04fc1650c97587fb3c298ab49ee6dfc9092068a09612b30b9707595af4705d904e8a63b8fd3e4fcf3eb6767635d2ffb77f036b58e2cae39c7ac571bd520ef5e49435599b6f9871d1bbd43d4e1329a1af1274c15ff63731f058c61cdc693e4c5d85cbeca8b3c5886a9f1d86bfa196ea89300bccd103c66c4dec0000caa80cee5f5cbd748312dc1288c33800750313e9534bfbd8ecbd23bec31fa7c97dd0fcc1581c3353fa38e09c1e888fd8c07766059e63e14579fa44d25a57231ab4504265217c8a8225bdd68983bf6570dd&x-goog-algorithm=GOOG4-RSA-SHA256&x-goog-credential=name-of-the-service-account%2F20190824%2Fus%2Fstorage%2Fgoog4_request&x-goog-date=20190824T183009Z&x-goog-expires=3600&x-goog-signedheaders=host
    
  2. 使用playbackFreeSWITCH Lua API's IVRMenu (examples)(这里是full application code):

    -- signed URL above stripped of the URL scheme
    local signed_url_without_url_scheme = "storage.googleapis..."
    
    i.unregistered_main:bindAction(
      "menu-exec-app",
      "playback shout://" .. signed_url_without_url_scheme, 
      "3"
    )
    

streamFile 我没有运气,但不是因为签名的 URL,而是因为我什至无法让它工作。文档参差不齐,某些部分甚至相互矛盾(例如比较 mod_shoutsession:streamFile)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多