GoLang HTTP Web 服务器提供 MP4 视频
挑战
使用 GoLang 创建了一个提供 HTML/JS/CSS 和图像的 Web 服务器。当服务器尝试提供 MP4 视频文件时,视频加载失败,仅显示视频控件。
调查
检查视频文件后,发现较小的视频可以正常工作,而较大的视频没有。该问题与视频大小和浏览器的默认缓冲行为有关。
范围请求支持:
对于大于特定大小的视频,浏览器需要服务器支持范围请求(部分内容服务)。这允许浏览器仅获取播放所需的视频部分,从而防止整个文件加载到内存中。
在这种情况下,GoLang 代码未配置为处理 Range 请求。所提供的实现只是将整个文件作为单个响应提供。因此,浏览器无法播放较大的视频。
解决方案
为了解决该问题,采取了以下步骤:
- 使用http.FileServe(): http.FileServe()方法默认处理Range请求。通过使用此方法提供视频文件,服务器能够向浏览器提供部分内容。
- 配置自定义范围请求处理:
或者,如果不首选 http.FileServe(),则可以实现自定义范围请求处理。这涉及在响应中设置以下标头:
- Accept-Ranges: bytes
- Content-Length(文件大小)
- Content-Range(字节) range request)
- 使用 HTTP 状态代码 206:
对于 Range 请求,服务器应返回 HTTP 状态代码 206部分内容而不是 200 OK。
实现
自定义范围请求处理是通过以下方式实现的:
<code class="go">func (vh *viewHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { path := r.URL.Path[1:] data, err := ioutil.ReadFile(string(path)) if err == nil { var contentType string if strings.HasSuffix(path, ".mp4") { contentType = "video/mp4" size := binary.Size(data) if size > 0 { requestedBytes := r.Header.Get("Range") w.Header().Add("Accept-Ranges", "bytes") w.Header().Add("Content-Length", strconv.Itoa(size)) w.Header().Add("Content-Range", "bytes "+requestedBytes[6:len(requestedBytes)]+strconv.Itoa(size-1)+"/"+strconv.Itoa(size)) w.WriteHeader(206) } } else { w.Header().Add("Content-Type", contentType) w.Write(data) } } else { log.Println("ERROR!") w.WriteHeader(404) w.Write([]byte("404 - " + http.StatusText(404))) } }</code>
循环视频:
为了确保视频循环,添加了以下逻辑:
<code class="go">if contentType == "video/mp4" { http.ServeFile(w, r, path) } else { w.Header().Add("Content-Type", contentType) w.Write(data) }</code>
这对 MP4 视频使用 http.ServeFile(),它可以正确处理循环。
以上是为什么我的 GoLang 网络服务器无法提供大型 MP4 视频?的详细内容。更多信息请关注PHP中文网其他相关文章!

在Go中,使用互斥锁和锁是确保线程安全的关键。1)使用sync.Mutex进行互斥访问,2)使用sync.RWMutex处理读写操作,3)使用原子操作进行性能优化。掌握这些工具及其使用技巧对于编写高效、可靠的并发程序至关重要。

如何优化并发Go代码的性能?使用Go的内置工具如gotest、gobench和pprof进行基准测试和性能分析。1)使用testing包编写基准测试,评估并发函数的执行速度。2)通过pprof工具进行性能分析,识别程序中的瓶颈。3)调整垃圾收集设置以减少其对性能的影响。4)优化通道操作和限制goroutine数量以提高效率。通过持续的基准测试和性能分析,可以有效提升并发Go代码的性能。

避免并发Go程序中错误处理的常见陷阱的方法包括:1.确保错误传播,2.处理超时,3.聚合错误,4.使用上下文管理,5.错误包装,6.日志记录,7.测试。这些策略有助于有效处理并发环境中的错误。

IndimitInterfaceImplementationingingoembodiesducktybybyallowingTypestoSatoSatiSatiSatiSatiSatiSatsatSatiSatplicesWithouTexpliclIctDeclaration.1)itpromotesflemotesflexibility andmodularitybybyfocusingion.2)挑战挑战InclocteSincludeUpdatingMethodSignateSignatiSantTrackingImplections.3)工具li

在Go编程中,有效管理错误的方法包括:1)使用错误值而非异常,2)采用错误包装技术,3)定义自定义错误类型,4)复用错误值以提高性能,5)谨慎使用panic和recover,6)确保错误消息清晰且一致,7)记录错误处理策略,8)将错误视为一等公民,9)使用错误通道处理异步错误。这些做法和模式有助于编写更健壮、可维护和高效的代码。

在Go中实现并发可以通过使用goroutines和channels来实现。1)使用goroutines来并行执行任务,如示例中同时享受音乐和观察朋友。2)通过channels在goroutines之间安全传递数据,如生产者和消费者模式。3)避免过度使用goroutines和死锁,合理设计系统以优化并发程序。

Gooffersmultipleapproachesforbuildingconcurrentdatastructures,includingmutexes,channels,andatomicoperations.1)Mutexesprovidesimplethreadsafetybutcancauseperformancebottlenecks.2)Channelsofferscalabilitybutmayblockiffullorempty.3)Atomicoperationsareef

go'serrorhandlingisexplicit,治疗eRROSASRETRATERTHANEXCEPTIONS,与pythonandjava.1)go'sapphifeensuresererrawaresserrorawarenessbutcanleadtoverbosecode.2)pythonandjavauseexeexceptionseforforforforforcleanerCodebutmaymobisserrors.3)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3汉化版
中文版,非常好用

Dreamweaver Mac版
视觉化网页开发工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具