我的目标是从浏览器读取HTTP MP3音频流并访问原始音频数据.
HTML5 <audio>让我可以轻松播放流,但据我所知,不会授予对原始音频数据的访问权限.它只是播放它.
JS XMLHTTPRequest可以通过HTTP下载文件并处理原始音频数据.它似乎是一个很好的候选者,但它受到限制:它不会授权访问二进制数据,直到下载完成(readystate = 4).在我的例子中,流是无限的,因此readystate永久保持在3并且XHR响应为空(这种行为在mozilla文档中有详细说明).请注意,我连接的服务器的跨源策略是Access-Control-Allow-Origin:*
代码示例适用于本地常规文件,但不适用于流.我在request.response.length上得到一个空指针异常
request = new XMLHttpRequest();
//request.open('GET', 'test.mp3', true);
request.open('GET', 'http://domain.com/stream.mp3', true);
request.responseType = 'arraybuffer';
request.onload = function() {
console.log("request onload");
var audioData = request.response;
audioCtx.decodeAudioData(audioData,
function(buffer) { myBuffer = buffer; source.buffer = myBuffer; },
function(e){"Error with decoding audio data" + e.err}
);
}
request.onreadystatechange = function() {
console.log("ready state = " + request.readyState);
console.log(request.response.length);
}
request.send();
Run Code Online (Sandbox Code Playgroud)
有没有人知道这些选项的替代方案或变通方法,以便在下载流时可以读取原始二进制数据包?
请注意,我无法控制服务器.这是一个icecast http流.此外,在浏览器方面,我想避免使用Flash.谢谢
编辑:为了澄清可能的跨源问题,JS在托管在localhost服务器上的页面上运行.
在 Ubuntu 16.04 上运行 Icecast 2.4.99.2 只是文件并想添加一个介绍文件。使用从 Darkice 默认声卡输入安装的工作源,当我将标签添加<intro>到安装的 Icecast 配置文件时,它会播放,但没有任何跟随。
<mount>
<mount-name>/archive</mount-name>
<max-listeners>5</max-listeners>
<fallback-mount>/high_quality.mp3</fallback-mount>
<intro>/high_quality.mp3</intro>
<fallback-override>1</fallback-override>
<hidden>0</hidden>
</mount>
Run Code Online (Sandbox Code Playgroud)
mp3 文件的文件权限:
user@stream:~/StationIDs$ sudo ls -lah /usr/share/icecast2/web/high_quality.mp3
-rwxr--r-- 1 root root 138K Nov 14 17:20 /usr/share/icecast2/web/high_quality.mp3
Run Code Online (Sandbox Code Playgroud)
我已阅读格式需要匹配,因此我使用 darckice.cfg 使用 128kps 比特率lame来从wav格式进行编码。
user@stream:~/StationIDs$ mediainfo high_quality.mp3
General
Complete name : high_quality.mp3
Format : MPEG Audio
File size : 138 KiB
Duration : 8s 777ms
Overall bit rate mode : Constant
Overall bit rate : 128 Kbps
Writing …Run Code Online (Sandbox Code Playgroud) 我似乎没有找到答案,所以我问你。现有的 Icecast2 服务器是否使用 TCP 或 UDP 来广播流数据?我知道它使用自定义的基于 HTTP 的应用程序层协议,所以人们可能会认为它是 TCP,但另一方面它是一个广播应用程序,所以 UDP 对我来说更合乎逻辑。如果它仍然使用 TCP,为什么要这样做?
我试图安排一个 Liquidsoap 流媒体源在未来的特定日期和时间播放。我相信这可以使用 Liquidsoapswitch命令来完成,但我无法理解此处描述的文档: http: //liquidsoap.fm/doc-1.2.0/reference.html#switch
使用液体皂可以吗?如果我能简单地传递一个时间戳,我会很好。
我正在努力使工作陷入困境2和我的letencrypt SSL没有运气。到目前为止,我所做的是构建了带有openssl支持的icecast 2,并且我也使其运行了,但是它总是在日志文件中给出下一个错误。
[2018-03-15 12:48:21] WARN connection/get_ssl_certificate Invalid private key file /usr/local/icecast/share/fullchain.pem
[2018-03-15 12:48:21] INFO connection/get_ssl_certificate No SSL capability on any configured ports
Run Code Online (Sandbox Code Playgroud)
我已将以下证书文件设置为可由用户读取:理查德,当然我也与理查德用户一起运行服务器本身。
也许您知道什么地方出了问题?
您可能还会在这里看到我的配置文件:
<listen-socket>
<port>8443</port>
<ssl>1</ssl>
</listen-socket>
Run Code Online (Sandbox Code Playgroud)
在路径部分,我将ssl-certificate部分设置为SSL。
<ssl-certificate>/usr/local/icecast/share/icecast/fullchain.pem</ssl-certificate>
Run Code Online (Sandbox Code Playgroud)
到目前为止没有。服务器本身正在端口上启动,但是通过https://访问时,它不会加载。使用http://端口(8443)可以正常工作。
任何帮助。
我想开始说,我已经四处寻找这个问题的答案,但似乎没有其他人遇到过这个问题,或者没有人在做这个问题。所以,我最近在我的 Debian 服务器上安装了 icecast2,问题是我完全能够从连接到端口 8000 上的本地 IP 的本地网络向我的服务器广播,并在 radio.example.com 上通过互联网收听流因为我用 nginx 代理它,所以到目前为止完全没有问题。问题在于当我想广播到我用 nginx stream.example.com 提供的域时
我有两个理论,一个是代理没有给 icecast 提供源 IP,所以它认为它是从 127.0.0.1 广播的,另一个是 nginx 对数据流做了一些奇怪的事情,因此没有提供正确的格式给冰铸。
有什么想法吗?提前致谢!
这是nginx配置
server {
listen 80;
listen [::]:80;
server_name radio.example.com;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
location / {
proxy_pass http://127.0.0.1:8000/radio;
subs_filter_types application/xspf+xml audio/x-mpegurl audio/x-vclt text/css text/html text/xml;
subs_filter ':80/' '/' gi;
subs_filter '@localhost' '@stream.example.com' gi;
subs_filter 'localhost' $host gi;
subs_filter 'Mount Point ' $host gi;
}
} …Run Code Online (Sandbox Code Playgroud) 我们构建了一个互联网广播流媒体,该流媒体广播利用了一个Icecast服务器通过html5音频标签将MP3传输到Firefox。但是,有时由于任何原因(断开连接等),流媒体都会停止,并且当您重新启动流媒体时,它会从会话开始时开始流媒体播放,这使我们相信它正在播放浏览器缓存中的内容。
使流媒体播放实际实时流的唯一方法是删除Firefox中的历史记录。在其他浏览器中不会发生这种情况。如果使用Flash后备广告而不是html5音频代码,也会发生这种情况。
考虑过使用以下脚本,但认为它不适用于这种情况。
<meta http-equiv="Cache-control" content="no-cache" />
Run Code Online (Sandbox Code Playgroud)
任何见解都会有所帮助。谢谢。
自从从 Mediaplayer 切换到简单的 Exoplayer 实现后,我注意到加载时间有了很大改善,但我想知道是否有任何内置功能,例如流式传输音频时的元数据更改侦听器?
我已经使用一个简单的例子实现了 Exoplayer,如下所示:
Uri uri = Uri.parse(url);
DefaultSampleSource sampleSource =
new DefaultSampleSource(new FrameworkSampleExtractor(context, uri, null), 2);
TrackRenderer audioRenderer = new MediaCodecAudioTrackRenderer(sampleSource);
mExoPlayerInstance.prepare(audioRenderer);
mExoPlayerInstance.setPlayWhenReady(true);
Run Code Online (Sandbox Code Playgroud) 我使用coolMic repo从Android 设备广播音频。
但是当我在 android studio 中导入它时出现以下错误:-
E:\New folder (2)\CoolMicApp-Android\app\build.gradle
Error:executing external native build for ndkBuild E:\New folder (2)\CoolMicApp-Android\app\src\main\jni\Android.mk
Error:executing external native build for ndkBuild E:\New folder (2)\CoolMicApp-Android\app\src\main\jni\Android.mk
Run Code Online (Sandbox Code Playgroud)
我检查了一些资源,但没有帮助解决这个问题。也从我按照以下步骤操作的coolMic文档: -
How to build coolmic:
1. Download Android Studio and the NDK
2. Clone this repository
3. Run the following commands:
$ git submodule init
$ git submodule update --init --recursive
4. Import the Project into Android Studio. Select gradle-wrapper.
5. Hit build(Arrovdown with 011001 next to it.
6. …Run Code Online (Sandbox Code Playgroud)