我想使用 WebRTC 将两个视频流从 Peer1 发送到 Peer2:让我们以前置和后置摄像头为例。
从概念上讲,Peer2 如何知道哪个流来自哪个相机?
MediaStream 文档提到 allMediaStream
和MediaStreamTrack
字段都是只读的,因此我无法直接向它们附加任何信息。我不能像{"stream1 id": "camera", "stream2 id": "screenshare"}
通过信令通道那样发送字典,因为 Peer2 将为每个流和轨道生成自己的 id。
我正在尝试通过MediaStreamSource将Shoutcast流式传输到我的MediaElement.这是一些基础知识的代码.使用ReadData方法,我可以下载原始音频数据(MP3样本),我的问题是如何将流设置为MediaStreamSource.这样它就不起作用(它编译并且MediaFailed事件没有错误,但我听不到任何声音).也许我应该在我的自定义ShoutcastMediaStreamSource中实现所有这些?固定流没有问题,只是非固定.有人可以给我一些建议吗?
在WP7上,没有可能设置"useUnsafeHeaderParsing",因此我无法使用shoutcast元数据获取http标头 - 仅使用原始数据.在ShoutcastMediaStreamSource中,我实现了一些ManagedMediaHelpers的代码.
谢谢
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://radiozetmp3-02.eurozet.pl:8400/;");
request.Method = "GET";
request.Headers["Icy-MetaData"] = "1";
request.UserAgent = "WinampMPEG/5.09";
request.AllowReadStreamBuffering = false;
request.BeginGetResponse(new AsyncCallback(RequestComplete), request);
allDone.WaitOne();
ShoutcastMediaStreamSource smss = new ShoutcastMediaStreamSource(stream);
player.SetSource(smss); // MediaElement
player.Play();
}
public void RequestComplete(IAsyncResult r)
{
HttpWebRequest request = (HttpWebRequest)r.AsyncState;
HttpWebResponse response = request.EndGetResponse(r) as HttpWebResponse;
stream = response.GetResponseStream();
IAsyncResult res = stream.BeginRead(buffer, 0, buffer.Length, callback, null);
allDone.Set();
}
public void ReadData(IAsyncResult r)
{
int bytes = stream.EndRead(r);
if …
Run Code Online (Sandbox Code Playgroud) 大多数Mediastream示例都是webCam-stream的解释.但我需要从本地视频文件(.webm或mp4)创建MediaStream.请告诉我.
Windows Phone 8应用程序.我们正在使用AudioStreamingAgent/Mp3MediaStreamSource来播放可以在本地缓存或从Web加载的MP3文件.
下载文件时,我们仍然使用AudioStreamingAgent/Mp3MediaStreamSource来确保我们能够在播放当前时预先缓存下一个文件.是的,我们可以使用WP8内置播放器来缓存文件,但在这种情况下我们将无法预先缓存下一个文件.
问题:在几个曲目之后,BackgroundAudioPlayer不再开始播放了.
毕竟,我看到曲目显示在UVC中,但它处于"Paused"状态.在UVC中按"播放"会在后台调用OnUserAction调用player.Play().没有什么变化.
有问题再现的样本,VS 2012(样本基于背景音频流媒体样本)
使用示例代码重现的步骤:
在WP8和WP8.1开发人员预览版中,在设备和仿真器上都会重现该问题.
更新:内存不足是不是这样.使用示例代码重现问题并查看backgroundlog.xml文件显示该示例仅使用20 Mb中的6 Mb允许此图片上的最后一列是"内存使用情况|允许的最大内存使用量"
c# audio-streaming mediastreamsource background-audio windows-phone-8
我想使用canvas元素作为webrtc通信的视频部分的mediastreamsource,任何方向都会有所帮助,搜索网络,找不到讨论这个主题的资源
*长篇背景故事*
问题是,我无法直接从相机发送视频,这是我在显示之前处理视频(一些图像处理内容,超出此问题的范围)的要求的一部分.
以前,在另一个对等的浏览器上<video>
,我没有使用标签直接显示视频,而是对隐藏的画布元素进行了一些处理,然后将细节复制到另一个画布(我使用了settimeout来保持绘图,这给了它illusion of live video
).
现在,客户希望在传输视频之前完成处理,因此我使用webrtc直接传递音频流(之前音频和视频都是通过webrtc发送的).对于视频流,我有两个解决方案:
脚步:
在本地对等体上处理视频,在隐藏的画布上绘制.简单的部分.
使用超时重复捕获图像数据并传输
a)使用websockets( yes, goes through server)
,这带来了可怕的延迟和浏览器的最终崩溃.
b)使用RTCDataChannel
,具有更好的性能,但有时无故失败.我还有其他几个问题(例如使用额外带宽,因为发送jpeg而不是webp).
另一个主要问题是,因为我正在使用超时:当我切换标签时,帧速率在另一侧下降.
那么,有什么方法可以将隐藏的画布用作mediastreamsource而不是我手动操作吗?
我有一个UWP项目,我想使用Windows.Media.Audio API来播放文件.我想要流式传输文件,而不是使用FileInputNode,因此我可以精确地确定各种时序属性.
我找到了MediaStreamSource API并制作了以下代码,试图解码16位PCM 2通道.wav文件
public async Task<Windows.Storage.Streams.Buffer> GetBuffer()
{
// check if the sample requested byte offset is within the file size
if (byteOffset + BufferSize <= mssStream.Size)
{
inputStream = mssStream.GetInputStreamAt(byteOffset);
// create the MediaStreamSample and assign to the request object.
// You could also create the MediaStreamSample using createFromBuffer(...)
MediaStreamSample sample = await MediaStreamSample.CreateFromStreamAsync(inputStream, BufferSize, timeOffset);
sample.Duration = sampleDuration;
sample.KeyFrame = true;
// increment the time and byte offset
byteOffset += BufferSize;
timeOffset = timeOffset.Add(sampleDuration);
return sample.Buffer; …
Run Code Online (Sandbox Code Playgroud) 我有这个简单的代码来获取视频流的块并在MediaSource中播放它们.我看到视频,但有时会停止.它可能会工作几秒钟或几分钟.但最后它在某个时刻停止了.chrome:// media-internals /显示没有错误.
这有什么不对?
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
var mediaSource = new MediaSource();
var constraints = {
"audio": true,
"video": {
"mandatory": {
"minWidth": 320, "maxWidth": 320,
"minHeight": 240, "maxHeight": 240
}, "optional": []
}
};
window.mediaSource = mediaSource;
var sourceBuffer;
var video = document.querySelector('#video');
window.video = video;
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function (e) {
console.log("sourceopen");
sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');
window.sourceBuffer = sourceBuffer;
}, false);
mediaSource.addEventListener('error', function (e) {
console.log("error", e)
}, false);
var stack …
Run Code Online (Sandbox Code Playgroud) Firefox 对音频媒体流的音频重采样能力有限。如果输入媒体流的采样率与 AudioCotext 的采样率不同,则会抱怨:
DOMException: AudioContext.createMediaStreamSource: Connecting AudioNodes from AudioContexts with different sample-rate is currently not supported.
Run Code Online (Sandbox Code Playgroud)
例如,如果我们得到这样的音频流:
navigator.mediaDevices.getUserMedia(constraints).then(stream => {
let context = new (window.AudioContext || window.webkitAudioContext)({sampleRate : 48000});
let audioInput = this.context.createMediaStreamSource(stream);
});
Run Code Online (Sandbox Code Playgroud)
Firefox 会抱怨采样率不匹配 - 如果音频子系统中的音频上下文和硬件设备设置之间的采样率不同。
我找不到从流中的音轨获取采样率的方法。我试过了 :
let tracks = stream.getAudioTracks();
let settings = tracks[0].getSettings();
let constraints = tracks[0].getConstraints();
Run Code Online (Sandbox Code Playgroud)
但这些对象中没有一个包含流的sampleRate。
是否有另一种方法来查询音轨/流的采样率?
我想为视频元素中播放的音频创建一个分贝计。视频元素正在播放 WebRTC 流。
\n\n目前,WebRTC 流无法传递到 Web 音频分析器中。(尽管这可能很快就会改变 \xe2\x80\xa6\xc2\xa0)(请参阅Web Audio API 分析器节点 getByteFrequencyData 返回空白数组)
\n\n目前是否有另一种方法可以从远程媒体流获取分贝信息?
\nwebrtc ×5
javascript ×4
audio ×1
c# ×1
firefox ×1
html5-video ×1
shoutcast ×1
streaming ×1
video ×1