Silverlight多媒体功能:声音、视频与深度缩放
立即解锁
发布时间: 2025-08-26 01:40:50 阅读量: 7 订阅数: 28 

# Silverlight 多媒体功能:声音、视频与深度缩放
## 1. 声音播放
在 Silverlight 中,声音播放功能可以通过简单的代码实现。以下代码展示了如何播放多个声音,并在一段时间后播放另一个声音:
```csharp
// Play the first two sounds.
explosionSound.Play();
explosion1.Play();
// Play the third sound half a second later.
timer.Tick += delegate
{
timer.Stop();
explosion2.Play();
};
timer.Start();
```
为了使代码简洁,使用了匿名方法来处理 `Timer.Tick` 事件。这种方式对于简单的任务(如停止计时器并播放声音)来说很合适,无需创建新的方法。
### 1.1 循环音频
使用 `SoundEffectInstance` 类而非 `SoundEffect` 类的另一个原因是它提供了额外的功能,其中最有用的是 `SoundEffectInstance.IsLooped` 属性,可用于播放循环的背景音乐:
```csharp
StreamResourceInfo sri explosionSoundStream = Application.GetResourceStream(
new Uri("Media;component/backgroundLoop.wav", UriKind.RelativeOrAbsolute));
SoundEffect backgroundEffect = SoundEffect.FromStream(sri.Stream);
SoundEffectInstance backgroundInstance = backgroundEffect.CreateInstance();
backgroundInstance.IsLooped = true;
backgroundInstance.Play();
```
要控制循环音频的播放,可以使用 `SoundEffectInstance` 类的 `Pause()`、`Resume()` 和 `Stop()` 方法,而这些方法在 `SoundEffect` 类中是没有的。
## 2. 网络摄像头和麦克风输入
Silverlight 4 增加了对通过用户的网络摄像头和麦克风进行视频和音频输入的支持。这为创建新类型的富互联网应用程序(如视频会议和多人游戏中的实时聊天)打开了大门。但要创建一个包含用户录制的音频或视频的实际应用程序,需要编写大量自定义代码,进行复杂的编码和解码,并依赖外部库来支持所需的格式。
### 2.1 访问捕获设备
使用 Silverlight 的网络摄像头和麦克风支持时,无需担心硬件配置或设备细节。Silverlight 会自动识别视频和音频捕获设备,并将其提供给应用程序。可以通过以下步骤查看 Silverlight 发现的设备:
1. 右键单击任何正在运行的 Silverlight 应用程序,显示 Silverlight 菜单。
2. 点击 “Silverlight”。
3. 选择 “Webcam/Mic” 选项卡。
所有捕获操作都从 `System.Windows.Media` 命名空间中的 `CaptureDeviceConfiguration` 类开始。该类提供了一些静态成员,用于请求设备访问和获取设备信息:
- `AllowedDeviceAccess`:布尔属性,如果用户已授予应用程序使用音频和视频捕获功能的权限,则返回 `true`。
- `RequestDeviceAccess()`:提示用户授予权限。
通常的做法是将检查权限和请求权限的步骤合并到一个 `if` 块中:
```csharp
if (CaptureDeviceConfiguration.AllowedDeviceAccess ||
CaptureDeviceConfiguration.RequestDeviceAccess())
{
// Permission has been granted.
}
else
{
// AllowedDeviceAccess was false (meaning no prior permission was granted) and
// RequestDeviceAccess() returned false (meaning the user declined to give
// permission.) No capture is possible.
}
```
注意,这里使用了 `OrElse` 运算符,以确保如果 `AllowedDeviceAccess` 已经为 `true`,则不会调用 `RequestDeviceAccess()` 方法。
获得权限后,可以使用以下方法获取默认的视频和音频设备:
- `GetDefaultVideoCaptureDevice()`:获取默认视频设备。
- `GetDefaultAudioCaptureDevice()`:获取默认音频设备。
也可以使用 `GetAvailableVideoCaptureDevices()` 和 `GetAvailableAudioCaptureDevices()` 方法获取所有支持的捕获设备,但由于关于单个设备的信息有限,且难以提前了解用户的硬件配置,因此通常是让用户选择设备。
### 2.2 基本网络摄像头支持
Silverlight 内置了对网络摄像头的两项支持:
- 在应用程序中显示实时网络摄像头视频。
- 从网络摄像头的视频流中拍摄快照(作为位图)。
以下是实现这些功能的步骤:
1. **创建 `CaptureSource` 对象**:
```csharp
private CaptureSource capture = new CaptureSource();
```
2. **分配视频或音频捕获设备**:
```csharp
capture.VideoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
capture.Start();
```
3. **显示视频**:如果要在页面中显示视频,需要使用 `VideoBrush`:
```csharp
private void cmdStartCapture_Click(object sender, RoutedEventArgs e)
{
if (CaptureDeviceConfiguration.AllowedDeviceAccess ||
CaptureDeviceConfiguration.RequestDeviceAccess())
{
capture.Stop();
capture.VideoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
if (capture.VideoCaptureDevice == null)
{
MessageBox.Show("Your computer does not have a video capture device.");
}
else
{
capture.Start();
VideoBrush videoBrush = new VideoBrush();
videoBrush.Stretch = Stretch.Uniform;
videoBrush.SetSource(capture);
rectWebcamDisplay.Fill = videoBrush;
}
}
}
```
4. **停止捕获**:
```csharp
private void cmdStopCapture_Click(object sender, RoutedEventArgs e)
{
capture.Stop();
}
```
5. **拍摄快照**:
```csharp
private void cmdSnapshot_Click(object sender, RoutedEventArgs e)
{
if (capture.State == CaptureState.Started)
{
capture.CaptureImageCompleted += capture_CaptureImageCompleted;
capture.CaptureImageAsync();
}
}
private void capture_CaptureImageCompleted(object sender,
CaptureImageCompletedEventArgs e)
{
imgSnapshot.Source = e.Result;
}
```
拍摄的位图可以进行存储、修改或上传,但由于位图文件较大,在存储或发送之前应将其转换为其他格式(如 PNG 或 JPEG),可以使用外部库(如 fjcore 或 .NET Image Tools)来实现。
### 2.3 录制音频片段
`CaptureSource` 只是一个
0
0
复制全文
相关推荐










