求助:使用YouTube V3 API(C#)获取已搜索视频时长
获取YouTube搜索结果中视频的时长(使用YouTube Data API v3)
嗨,我明白你的需求——用NuGet的YouTube V3 API获取搜索到的视频时长对吧?你的现有代码已经能搜到视频,但问题在于Search.List接口只返回视频的基础信息(比如标题、缩略图),并不包含时长这类详细元数据。要拿到时长,我们得额外调用Videos.List接口来获取视频的contentDetails字段。
下面是修改后的完整代码,我会一步步给你说明:
步骤1:收集搜索到的视频ID
先在遍历搜索结果时,把所有视频类型的ID收集起来,这样可以批量请求,既高效又能节省API配额:
var searchListRequest = youtubeService.Search.List("snippet"); searchListRequest.Q = Find; searchListRequest.MaxResults = 5; var searchListResponse = await searchListRequest.ExecuteAsync(); // 收集所有视频ID var videoIds = new List<string>(); foreach (var searchResult in searchListResponse.Items) { if (searchResult.Id.Kind == "youtube#video") { videoIds.Add(searchResult.Id.VideoId); } }
步骤2:调用Videos.List获取时长信息
接着用收集到的ID批量请求视频的contentDetails(这个字段里就包含时长):
if (videoIds.Any()) { var videosRequest = youtubeService.Videos.List("contentDetails"); videosRequest.Id = string.Join(",", videoIds); // 用逗号分隔多个ID实现批量请求 var videosResponse = await videosRequest.ExecuteAsync(); foreach (var video in videosResponse.Items) { // 时长是ISO 8601格式,比如PT15M30S表示15分30秒 string isoDuration = video.ContentDetails.Duration; // 可以转换成更友好的TimeSpan格式 TimeSpan duration = XmlConvert.ToTimeSpan(isoDuration); Console.WriteLine($"视频ID: {video.Id},时长: {duration.ToString(@"hh\:mm\:ss")}"); } }
关键说明
- 为什么要分开调用?因为YouTube的Search API为了性能,只返回最基础的搜索结果元数据,详细的视频属性(时长、分辨率、播放量等)都需要通过Videos API单独获取。
- 批量请求:一次请求多个视频ID比逐个请求更高效,也能减少API配额的消耗。
- 时长格式转换:
ContentDetails.Duration返回的是ISO 8601标准格式,用XmlConvert.ToTimeSpan()就能轻松转换成C#的TimeSpan,再格式化成你需要的样式就行。
这样你就能顺利拿到每个搜索结果视频的时长啦!
内容的提问来源于stack exchange,提问作者Kirdus
相关产品推荐
相关产品推荐

