gomedia icon indicating copy to clipboard operation
gomedia copied to clipboard

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

Open mediawall opened this issue 2 years ago • 7 comments

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

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

mediawall avatar May 03 '23 17:05 mediawall

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

c1ngular avatar May 04 '23 08:05 c1ngular

就是想着怎么能避免安装很大的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

mediawall avatar May 04 '23 09:05 mediawall

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

yapingcat avatar May 04 '23 13:05 yapingcat

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

lab37 avatar Feb 04 '24 09:02 lab37

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

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

yapingcat avatar Feb 04 '24 10:02 yapingcat

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

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

yapingcat avatar Feb 04 '24 11:02 yapingcat

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

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

好的,谢谢解答

lab37 avatar Feb 04 '24 11:02 lab37