Files
go_H264Server/controller/test.go
niehengyang 65cb7a2d8d first commit
2023-06-21 10:43:01 +08:00

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())
}