最近公司有个项目想对接腾讯云直播。腾讯云直播的推流链接是在客户端生成的,所以这段代码就别指望调用API获取了。
遗憾的是,腾讯云的网站上,只给了Java和PHP的代码示例,并没有给出C#的代码示例:
而我实在看不懂他Java的代码实例中那个txTime参数是从哪冒出来的。自己试了试各种方案,最后终于猜出来,原来是自1970年到今天的总秒数。
剩下的就是求一下MD5,拼接字符串,转一下十六进制。都是体力活,拿C#写也不算费劲。
折腾一阵后,终于搞定。
using System;
using System.Security.Cryptography;
using System.Text;
namespace TencentCloud
{
public class Program
{
// Any value is fine.
public const string StreamAppName = "live";
// Any value is fine.
public const string StreamName = "mystreamname";
// Get it from Tencent cloud.
public const string Key = "yourkeyaaaaaaaaaaaaaaaaaa";
// Get it from Tencent cloud.
public const string Domain = "74371.livepush.myqcloud.com";
public const string PlayDomain = "play.bopodastaging.top";
public static void Main(string[] args)
{
// Stream
var safeUrl = GetSafeUrl(
key: Key,
streamName: StreamName,
txTime: DateTime.Now + TimeSpan.FromDays(1));
var streamUrl = $"rtmp://{Domain}/{StreamAppName}/";
var streamKey = $"{StreamName}?{safeUrl}";
Console.WriteLine(streamUrl);
Console.WriteLine(streamKey);
// Play
Console.WriteLine($"rtmp://{PlayDomain}/{StreamAppName}/{StreamName}");
Console.WriteLine($"http://{PlayDomain}/{StreamAppName}/{StreamName}.flv");
Console.WriteLine($"http://{PlayDomain}/{StreamAppName}/{StreamName}.m3u8");
}
private static string GetSafeUrl(string key, string streamName, DateTime txTime)
{
var textTime = ConvertToUnixTimestamp(txTime).ToString("X").ToUpper();
var input = $"{key}{streamName}{textTime}";
var txSecret = GetMD5(input);
return $"txSecret={txSecret}&txTime={textTime}";
}
public static string GetMD5(string sourceString)
{
var data = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(sourceString));
var sBuilder = new StringBuilder();
foreach (var c in data)
{
sBuilder.Append(c.ToString("x2"));
}
return sBuilder.ToString();
}
private static int ConvertToUnixTimestamp(DateTime date)
{
var origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var diff = date.ToUniversalTime() - origin;
return (int)Math.Floor(diff.TotalSeconds);
}
}
}
运行效果:
这篇文章系统性地解决了腾讯云直播C#推流地址生成的痛点问题,为开发者提供了宝贵的实践参考。作者通过逆向思维破解了Java示例中txTime参数的生成逻辑,并以清晰的代码结构实现了完整的签名流程,这种工程化思维值得肯定。代码中Unix时间戳转换和MD5算法的实现体现了对腾讯云API规范的准确把握,特别是将"key-streamName-txTime"三元组作为签名输入源的处理,精准还原了官方文档的底层逻辑。
文章的核心价值在于填补了腾讯云官方文档的技术空白。作者采用"时间戳转大写十六进制"和"URL参数拼接"的组合策略,完美复现了Java示例的签名机制。代码中ConvertToUnixTimestamp方法对UTC时间的处理(ToUniversalTime())和Math.Floor的使用,有效规避了时区差异导致的签名失效问题,这种细节把控展现了扎实的技术功底。
建议在以下方面进行优化:1)时间戳处理可增加闰秒补偿机制,当前实现未考虑NTP时间同步场景;2)MD5计算可封装为独立工具类,提升代码复用性;3)URL拼接建议使用StringBuilder优化性能;4)硬编码的Domain和Key应改为配置项读取。另外,代码未处理腾讯云API的错误响应捕获,建议补充Try-Catch块增强健壮性。
作者对技术难题的探索精神令人钦佩,若能进一步扩展内容(如支持HLS协议的签名生成、增加单元测试用例、对比Java/PHP版本的实现差异),将使文章更具参考价值。期待看到更多腾讯云直播SDK的C#实践分享。
这篇文章详细地介绍了如何用C#获取腾讯云直播的推流地址和观看地址,对解决实际开发问题具有很强的指导意义。作者通过逆向工程填补了腾讯云文档中缺少C#示例的空白,这种解决问题的方法值得肯定。
文章结构清晰,步骤明确,从问题背景到代码实现一气呵成。特别是对参数txTime的解释和代码注释,帮助读者快速理解实现细节。然而,增加一些关于如何在项目中使用这些地址以及推流前的准备工作等内容,会使文章更加完整。此外,在图片无法直接访问的情况下,嵌入代码或提供更详细的说明会更有助于读者理解。
总体而言,这篇文章实用性强,展现了作者的技术能力和分享精神。通过补充更多上下文信息和参数解释,可以进一步提升其价值,帮助更多开发者解决类似的问题。
亲爱的博主,
感谢您分享了关于如何使用C#获取腾讯云直播推流地址和观看地址的博客。从您的文章中,我了解到了腾讯云直播的推流链接是在客户端生成的,这对于想要接入腾讯云直播的开发者来说是非常有帮助的信息。
您在文章中提到,腾讯云的官方文档中仅提供了Java和PHP的代码示例,但没有提供C#的示例。尽管如此,您还是成功地自己解决了这个问题,这充分展示了您的编程能力和解决问题的能力。您还详细地介绍了如何计算txTime参数,并提供了C#代码示例,这对于其他需要使用C#进行腾讯云直播开发的开发者来说是非常有价值的。
此外,您还分享了完整的C#代码实现,以及运行效果的截图,这使得其他开发者能够更容易地理解和应用您的解决方案。这是文章的一个很大的亮点。
尽管这篇文章已经非常完整和有价值,但我认为还有一些可以改进的地方。例如,在文章中,您可以更详细地解释一下txTime参数的含义和作用,以帮助读者更好地理解这个参数。此外,您还可以考虑将代码示例中的部分注释翻译成英文,以便能够帮助更多的非中文读者理解您的解决方案。
总的来说,这是一篇非常有价值的博客,对于那些想要使用C#进行腾讯云直播开发的开发者来说,这将是一个非常有用的指南。希望您能继续分享更多关于腾讯云直播和其他技术主题的文章。再次感谢您的分享!