C# 实时流转换为m3u8
主要通过FFmpeg 执行命令进行转换
FFmpeg 下载地址
命令行
ffmpeg -i "rtsp://your_rtsp_stream_address" -codec: copy -start_number 0 -hls_time 10 -hls_list_size 12 -f hls "output.m3u8"
start_number 设置播放列表中最先播放的索引号,默认 0
hls_time 10 :切片长度 单位秒 10秒
hls_list_size size 设置播放列表中字段最大数。如果为0,则包含所有分段。默认为5
-f hls:输出格式为HLS
output.m3u8 输出文件名,可以完整路径
通过C# 执行命令行
我是winfrom 所有把ffmpeg 放到了执行目录
也可以把ffmpeg 注册到环境变量中
1、右击“计算机”或“此电脑”,选择“属性”。
2、点击“高级系统设置”,然后点击“环境变量”。
3、在“系统变量”部分,找到并选中“Path”变量,点击“编辑”。
4、在“变量值”字段末尾添加 FFmpeg 的 bin 目录路径(例如 C:\ffmpeg\bin),用分号分隔开。
5、点击“确定”保存更改,按 Win + R,输入 cmd,然后按 Enter 打开命令提示符。输入 ffmpeg -version 并按 Enter。如果安装成功,会显示 FFmpeg 的版本信息
C# 执行命令行代码
/// <summary>
/// 执行命令
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
private void ConvertVideo(string command)
{
using (var process = new Process())
{
//这里如果写入了环境变量就不用写ffmpeg的完整路径
process.StartInfo.FileName = Path.Combine(System.Environment.CurrentDirectory, "ffmpeg.exe"); // 指定命令行解释器;
process.StartInfo.Arguments = command;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.ErrorDataReceived += Process_OutputDataReceived;
process.EnableRaisingEvents = true;
process.Exited += Process_Exited;
try
{
process.Start();
process.BeginErrorReadLine();
}
catch (Exception ex)
{
throw new Exception("FFmpeg启动失败:" + ex.Message);
}
}
}
/// <summary>
/// 进程被结束
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Process_Exited(object sender, EventArgs e)
{
}
/// <summary>
/// 显示输出
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
AddText(e.Data);
//outputTextBox.AppendText(e.Data + Environment.NewLine);
}
}
private void AddText(string Data)
{
// 更新UI线程中的控件,例如文本框显示输出
outputTextBox.Invoke((MethodInvoker)delegate
{
outputTextBox.AppendText(Data + Environment.NewLine);
});
}
调用
海康&大华&DSS获取RTSP
实时流
海康:
rtsp://[username]:[password]@ip:[port]/[codec]/[channel]/[subtype]/av_stream
说明:
username: 用户名。例如admin。
password: 密码。例如12345。
ip: 为设备IP。例如 192.0.0.64。
port: 端口号默认为554,若为默认可不填写。
codec:有h264、MPEG-4、mpeg4这几种。
channel: 通道号,起始为1。例如通道1,则为ch1。
subtype: 码流类型,主码流为main,辅码流为sub。
栗子:
IPC
rtsp://admin:123456@192.168.18.105:554/h264/ch1/main/av_stream
NVR
rtsp://admin:123456@192.168.18.106:554/Streaming/Channels/101
说明:
101,第一个1代表通道,最后一个1代表麻溜。
大华:
rtsp://[username]:[password]@ip:[port]/cam/realmonitor?channel=1&subtype=0
说明:
username: 用户名。例如admin。
password: 密码。例如admin。
ip: 为设备IP。例如 10.7.8.122。
port: 端口号默认为554,若为默认可不填写。
channel: 通道号,起始为1。例如通道2,则为channel=2。
subtype: 码流类型,主码流为0(即subtype=0),辅码流为1(即subtype=1)。
栗子:
rtsp://admin:admin@192.168.18.107:554/cam/realmonitor?channel=2&subtype=1
回放流
海康:
rtsp://[username]:[password]@ip:[port]/Streaming/tracks/101?starttime=20120802t063812z&endtime=20120802t064816z
说明:
101:1,表示通道1;01,表示以单播形式回放指定设备的通道中的录像文件
starttime:开始时间
endtime:结束时间
时间范围是starttime到endtime,其中starttime和endtime的格式要符合ISO 8601。
具体格式是YYYYMMDD”T”HHmmSS.fraction”Z” ,Y是年,M是月,D是日,T是时间分格符,H是小时,M是分,S是秒,Z是可选的、表示Zulu (GMT) 时间。
大华:
rtsp://[username]:[password]@ip:[port]/cam/playback?channel=1&subtype=0&starttime=2017_01_10_01_00_00&endtime=2017_01_10_02_00_00
说明:
username: 用户名。例如admin。
password: 密码。例如admin。
ip: 为设备IP。
port: 端口号默认为554,若为默认可不填写。
channel: 通道号,起始为1。例如通道2,则为channel=2。
subtype: 码流类型,主码流为0(即subtype=0),辅码流为1(即subtype=1)。
starttime:开始时间
endtime:结束时间
大华DSS
rtsp://ip:[port]/dss/monitor/params?cameraid=设备编号$通道号&substream=码流类型
说明:
设备编号:平台上设备编号,例如1000004
通道号:设备下通道,从0(通道一)开始。
码流类型:1代表主码流,2代表辅码流
栗子:
rtsp://192.168.19.102:9090/dss/monitor/params?cameraid=1000112$0&substream=1