mirror of
https://github.com/niehengyang/go_H264Server.git
synced 2025-09-27 20:12:07 +08:00
95 lines
2.0 KiB
Go
95 lines
2.0 KiB
Go
package controller
|
|
|
|
import (
|
|
"bytes"
|
|
"dm/utils/rtpToImg"
|
|
"github.com/gen2brain/x264-go"
|
|
"github.com/gin-gonic/gin"
|
|
"image/jpeg"
|
|
)
|
|
|
|
func DecodeH264(c *gin.Context) {
|
|
|
|
// 读取图片数据
|
|
imgData, err := loadImage("./output/1683881609034.jpg")
|
|
if err != nil {
|
|
c.JSON(500, gin.H{"msg": "图片读取失败..." + err.Error()})
|
|
return
|
|
}
|
|
|
|
// 创建x264编码器
|
|
opts := &x264.Options{
|
|
Width: imgData.Bounds().Size().X,
|
|
Height: imgData.Bounds().Size().Y,
|
|
FrameRate: 25,
|
|
Tune: "zerolatency",
|
|
Preset: "veryfast",
|
|
Profile: "baseline",
|
|
LogLevel: x264.LogDebug,
|
|
}
|
|
|
|
//保存H264数据
|
|
buf := bytes.NewBuffer(make([]byte, 0))
|
|
|
|
enc, err := x264.NewEncoder(buf, opts)
|
|
if err != nil {
|
|
c.JSON(500, gin.H{"msg": "解析图片数据..." + err.Error()})
|
|
return
|
|
}
|
|
|
|
err = enc.Encode(imgData)
|
|
if err != nil {
|
|
c.JSON(500, gin.H{"msg": "格式化图片数据..." + err.Error()})
|
|
return
|
|
}
|
|
|
|
err = enc.Flush()
|
|
if err != nil {
|
|
c.JSON(500, gin.H{"msg": "刷新x264工具..." + err.Error()})
|
|
return
|
|
}
|
|
|
|
err = enc.Close()
|
|
if err != nil {
|
|
c.JSON(500, gin.H{"msg": "关闭x264工具..." + err.Error()})
|
|
return
|
|
}
|
|
|
|
// setup H264->raw frames decoder
|
|
h264RawDec, err := rtpToImg.NewH264Decoder()
|
|
if err != nil {
|
|
c.JSON(500, gin.H{"msg": "解码器..." + err.Error()})
|
|
return
|
|
}
|
|
defer h264RawDec.Close()
|
|
|
|
//convert NALUs into RGBA frames
|
|
img, err := h264RawDec.Decode(buf.Bytes())
|
|
if err != nil {
|
|
c.JSON(500, gin.H{"msg": "解码..." + err.Error()})
|
|
return
|
|
}
|
|
|
|
// wait for a frame
|
|
if img == nil {
|
|
c.JSON(500, gin.H{"msg": "未获取到图片..."})
|
|
return
|
|
}
|
|
|
|
// 将图像数据编码为字节
|
|
var imgBuf bytes.Buffer
|
|
err = jpeg.Encode(&imgBuf, img, nil)
|
|
if err != nil {
|
|
c.JSON(500, gin.H{"msg": "将图像数据编码为字节..." + err.Error()})
|
|
return
|
|
}
|
|
|
|
// 设置响应头
|
|
c.Header("Content-Type", "image/jpeg")
|
|
c.Header("Content-Disposition", "inline; filename=image.jpg")
|
|
|
|
// 将图像数据写入响应主体
|
|
c.Writer.Write(imgBuf.Bytes())
|
|
|
|
}
|