我正在使用vlc插件播放rtmp链接以进行直播。如果将流媒体链接放在目标标记中,就像在下面的代码中一样,它可以正常工作:
<embed
type='application/x-vlc-plugin'
pluginspage='http://www.videolan.org'
version='VideoLAN.VLCPlugin.2'
width='800'
height='600'
id='vlc'
loop='yes'
autoplay='yes'
target="rtmp://122.221.75.124:1935/live/myc001">
</embed>
问题: 所以我的要求是通过显示html源代码来隐藏来自观众的rtmp链接。我使用Http Handler从数据库返回链接。 vlc插件Target标记为:
target="Handler1.ashx?ChannelID=22">
我的Hanlder1.ashx代码是:
public class Handler1 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
if (context.Request.QueryString["ChannelID"] == null) return;
string connStr = Connection_Class.Str_Conn;
string channelID = context.Request.QueryString["ChannelID"];
if (channelID == "") { return; }
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand("SELECT Link FROm TblChannel WHERE ChannelID = @id", conn))
{
cmd.Parameters.Add(new SqlParameter("@id", channelID));
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
reader.Read();
if (reader.HasRows == true)
{
string lnk = "";
lnk = reader["Link"].ToString();
context.Response.Clear();
context.Response.Write(lnk);
reader.Close();
context.Response.End();
}
else
{ return; }
}
}
}
当我在浏览器中输入时,Hanlder1正确返回链接:
http://localhost:54091/handler1.ashx?channelid=22
我在vlc Target tage中使用了相同的方法:(target =“http:// localhost:54091 / handler1.ashx?channelid = 22”)但链接不起作用。我使用断点来验证处理程序是否正常工作并返回字符串,但vlc不播放流。
答案 0 :(得分:0)
我尝试了302重定向,而VLC也没有做出任何反应。问题是vlc期待rtmp或rtmpt协议,你试图将它重定向到http层 - 这是行不通的。您必须在rmpt级别上进行重定向或创建rmpt代理而不是http处理程序。如果您正以这种方式看看http://www.fluorinefx.com/download.html - 对于这项工作来说似乎是非常棒的.NET API。
其他方式(我不知道你对rmpt服务器本身有多少控制权,这种方式假设你确实对它有一些控制权)是破解握手阶段 - 即你将直接生成到rmtp的链接作为链接的一部分,您将通过对称加密的令牌。 - 即。 rmpt:// whatver?在秘密部分中的token = secret将是时间戳和一些随机的rubish以使其安全; rmpt服务器将解码令牌并拒绝所有具有旧时间戳的请求 - 这样人们可以看到该链接,但在一段时间后它将变得无法使用。
答案 1 :(得分:0)
问题是你的处理程序正在返回流的url,而不是VLC期望的流本身。解决这个问题的最简单方法是使用处理程序并将目标指向它,而不是在获取页面时从asp设置目标属性:
<embed
type='application/x-vlc-plugin'
pluginspage='http://www.videolan.org'
version='VideoLAN.VLCPlugin.2'
width='800'
height='600'
id='vlc'
loop='yes'
autoplay='yes'
target="<%= GetStreamLocation() %>" />
然后在页面后面的代码中有一个函数:
protected string GetStreamLocation()
{
int channelId;
var success = int.TryParse(Request.QueryString["ChannelID"], out channelId);
if (!success) throw new Exception("Invalid channel id specified");
string returnValue;
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand("SELECT Link FROM TblChannel WHERE ChannelID = @id", conn))
{
cmd.Parameters.Add(new SqlParameter("@id", channelID));
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
reader.Read();
if (reader.HasRows == true)
{
returnValue = reader["Link"].ToString();
reader.Close();
}
}
}
}
if (string.IsNullOrEmpty(returnValue)) throw new Exception("Error loading link from database");
return returnValue;
}
这将在页面加载时自动将Feed的链接插入目标属性。