yapingcat / gomedia

golang library for rtmp, mpeg-ts,mpeg-ps,flv,mp4,ogg,rtsp
MIT License
406 stars 70 forks source link

h264视频文件获取frame后如何保存为图片? #73

Open mediawall opened 1 year ago

mediawall commented 1 year ago
import (
    "bytes"
    "fmt"
    "io/ioutil"
    "os"

    "github.com/yapingcat/gomedia/go-mpeg2"
)

func main() {
    f, _ := os.Open("x.mp4")
    defer f.Close()

    dm := mpeg2.NewTSDemuxer()
    dm.OnFrame = func(cid mpeg2.TS_STREAM_TYPE, frame []byte, pts uint64, dts uint64) {
        if cid == mpeg2.TS_STREAM_H264 {
            println("---1", len(frame), pts, dts)
            // how to convert frame []byte to jpg or png?
        }
    }

    buf, _ := ioutil.ReadAll(f)
    fmt.Printf("read %d size\n", len(buf))
    fmt.Println(dm.Input(bytes.NewReader(buf)))
}

抱歉啊,搜索了半天没有找到解决办法。对视频图像了解实在有限,请教下是不是可行,谢谢!

c1ngular commented 1 year ago

需要解码,你可能需要的是ffmpeg

mediawall commented 1 year ago

就是想着怎么能避免安装很大的ffmpeg

我的视频ffpobe 结果是:

Input #0, flv, from '4.flv':
  Duration: N/A, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: h264 (High), yuv420p(progressive), 1280x720, 1k tbr, 1k tbn
Input #0, mpegts, from 'x.ts':
  Duration: 00:00:06.00, start: 20.034000, bitrate: 314 kb/s
  Program 1 
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
  Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuvj420p(pc, bt709, progressive), 352x288, 30 tbr, 90k tbn
yapingcat commented 1 year ago

纯golang做不到 需要先解码再编码,ffmpeg比较合适 或者用cgo调用ffmpeg的library

lab37 commented 9 months ago

能不能实现只把H264的关键帧保存成图片。这样会不会简单一些。不太想引入ffmpeg,Cgo有点拉跨

yapingcat commented 9 months ago

能不能实现只把H264的关键帧保存成图片。这样会不会简单一些。不太想引入ffmpeg,Cgo有点拉跨

实现是是一样的,都需要先解码再编码

yapingcat commented 9 months ago

能不能实现只把H264的关键帧保存成图片。这样会不会简单一些。不太想引入ffmpeg,Cgo有点拉跨

不想用cgo,可以试试ffmepg 管道模式. 或者开发一个简单转码服务,go程序用socket/zmq 其他进程间通信方式与之交互,传输h264

lab37 commented 9 months ago

能不能实现只把H264的关键帧保存成图片。这样会不会简单一些。不太想引入ffmpeg,Cgo有点拉跨

不想用cgo,可以试试ffmepg 管道模式. 或者开发一个简单转码服务,go程序用socket/zmq 其他进程间通信方式与之交互,传输h264

好的,谢谢解答