1. 程式人生 > 其它 >C#RTSP通訊2:RTSP語音廣播+語音對講(WinForm版本)

C#RTSP通訊2:RTSP語音廣播+語音對講(WinForm版本)

C#RTSP通訊1:C#高效能RTSP播放器(使用FFmepg封裝自定義控制元件,使用簡單)

C#RTSP通訊2:RTSP語音廣播+語音對講(WinForm版本)

程式架構

程式碼呼叫

using NAudio.Codecs;
using NAudio.Wave;
using RTSPClient;
using System;
using System.IO;
using System.Threading;
using System.Windows.Forms;

namespace RtspAudio
{
    public partial class MainForm : Form
    {
        RTSPSession session 
= new RTSPSession(); IWaveIn sourceStream; public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { // 錄音初始化 sourceStream = new WaveInEvent(); sourceStream.WaveFormat
= new WaveFormat(8000, 16, 1); sourceStream.DataAvailable += new EventHandler<WaveInEventArgs>(SourceStream_DataAvailable); sourceStream.StartRecording(); } private async void btnInit_Click(object sender, EventArgs e) { // rtsp 語音初始化 await
session.InitVoice(txtRtspUrl.Text.Trim(), txtUserName.Text.Trim(), txtPassword.Text.Trim()); lblMsg.Text = session.Status ? "初始化成功" : "初始化失敗:" + session.Errmsg; } private void btnCheckFile_Click(object sender, EventArgs e) { // 選擇G711檔案 openFileDialog1.Title = "請選擇資料夾"; openFileDialog1.Filter = "(*.g711a)|*.g711a"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { txtFile.Text = openFileDialog1.FileName; } } private void btnStartAudio_Click(object sender, EventArgs e) { if (!session.Status) return; session.VoiceStatus = 1; byte[] audio = File.ReadAllBytes(txtFile.Text.Trim());// out1_8k.g711a css.pcm left.g711a ThreadPool.QueueUserWorkItem(async p => { string note = ""; try { await session.PlayAudio_G711A(audio, 25, 8000, session.Ssrc2, session.Channel); note = "播放結束"; } catch (Exception ex) { note = "播放失敗,errmsg:" + ex.Message; } this.BeginInvoke((EventHandler)(delegate { lblMsg.Text = note; })); }); lblMsg.Text = "開始播報"; } private void btnStopAudio_Click(object sender, EventArgs e) { if (!session.Status) return; session.VoiceStatus = 0; lblMsg.Text = "停止播報"; } private void btnStartTalk_Click(object sender, EventArgs e) { // 開始對講 if (!session.Status) return; session.VoiceStatus = 2; lblMsg.Text = "開始對講"; } private void btnStopTalk_Click(object sender, EventArgs e) { // 停止對講 if (!session.Status) return; session.VoiceStatus = 0; lblMsg.Text = "停止對講"; } private async void SourceStream_DataAvailable(object sender, WaveInEventArgs e) { if (!session.Status || (2 != session.VoiceStatus)) return; byte[] encoded = TwoWayAudio_Encode_MuLaw(e.Buffer, 0, e.BytesRecorded); try { await session.SendData(encoded, session.Channel); } catch (Exception ex) { this.BeginInvoke((EventHandler)(delegate { lblMsg.Text = "對講失敗,errmsg:" + ex.Message; })); } } private byte[] TwoWayAudio_Encode_MuLaw(byte[] data, int offset, int length) { byte[] encoded = new byte[length / 2]; int outIndex = 0; for (int n = 0; n < length; n += 2) { encoded[outIndex++] = MuLawEncoder.LinearToMuLawSample(BitConverter.ToInt16(data, offset + n)); } return encoded; } } }
qq:505645074