Comments (3)
@xuxiangyang Hi.
Could You provide code, which causes this SEGSEGV?
from gmf.
sure, Like this
package snapshot
import (
"errors"
"github.com/3d0c/gmf"
"io/ioutil"
"os"
)
func Grab(url string) (*os.File, error) {
inputCtx, err := gmf.NewInputCtx(url)
if err != nil {
return nil, err
}
defer inputCtx.CloseInputAndRelease()
srcVideoStream, err := inputCtx.GetBestStream(gmf.AVMEDIA_TYPE_VIDEO)
if err != nil {
return nil, err
}
codec, err := gmf.FindEncoder("mjpeg")
if err != nil {
return nil, err
}
cc := gmf.NewCodecCtx(codec)
defer gmf.Release(cc)
cc.SetPixFmt(gmf.AV_PIX_FMT_YUVJ420P)
cc.SetWidth(srcVideoStream.CodecCtx().Width())
cc.SetHeight(srcVideoStream.CodecCtx().Height())
cc.SetTimeBase(srcVideoStream.CodecCtx().TimeBase().AVR())
if codec.IsExperimental() {
cc.SetStrictCompliance(gmf.FF_COMPLIANCE_EXPERIMENTAL)
}
if err := cc.Open(nil); err != nil {
return nil, err
}
for packet := range inputCtx.GetNewPackets() {
if packet.StreamIndex() != srcVideoStream.Index() {
continue
}
ist, err := inputCtx.GetStream(packet.StreamIndex())
if err != nil {
return nil, err
}
for frame := range packet.Frames(ist.CodecCtx()) {
if p, ready, _ := frame.EncodeNewPacket(cc); ready {
defer gmf.Release(p)
return newFile(p.Data())
}
}
}
return nil, errors.New("can not get Packets")
}
func newFile(b []byte) (*os.File, error) {
fp, err := ioutil.TempFile("", "snapshot_")
if err != nil {
return nil, err
}
defer fp.Close()
_, err = fp.Write(b)
if err != nil {
return nil, err
} else {
return fp, nil
}
}
I concomitantly use Grab
func
from gmf.
@xuxiangyang Fixed via #51 Please pull latest master and test.
I don't know what type of synchronization do you use, but here is my main
function which i tested:
package main
import (
"errors"
"io/ioutil"
"log"
"os"
"sync"
"github.com/3d0c/gmf"
)
func Grab(url string, wg *sync.WaitGroup) (*os.File, error) {
defer wg.Done()
inputCtx, err := gmf.NewInputCtx(url)
if err != nil {
return nil, err
}
defer inputCtx.CloseInputAndRelease()
srcVideoStream, err := inputCtx.GetBestStream(gmf.AVMEDIA_TYPE_VIDEO)
if err != nil {
return nil, err
}
codec, err := gmf.FindEncoder("mjpeg")
if err != nil {
return nil, err
}
cc := gmf.NewCodecCtx(codec)
defer gmf.Release(cc)
cc.SetPixFmt(gmf.AV_PIX_FMT_YUVJ420P)
cc.SetWidth(srcVideoStream.CodecCtx().Width())
cc.SetHeight(srcVideoStream.CodecCtx().Height())
cc.SetTimeBase(srcVideoStream.CodecCtx().TimeBase().AVR())
if codec.IsExperimental() {
cc.SetStrictCompliance(gmf.FF_COMPLIANCE_EXPERIMENTAL)
}
if err := cc.Open(nil); err != nil {
return nil, err
}
for packet := range inputCtx.GetNewPackets() {
if packet.StreamIndex() != srcVideoStream.Index() {
continue
}
ist, err := inputCtx.GetStream(packet.StreamIndex())
if err != nil {
return nil, err
}
for frame := range packet.Frames(ist.CodecCtx()) {
if p, ready, _ := frame.EncodeNewPacket(cc); ready {
defer gmf.Release(p)
return newFile(p.Data())
}
}
}
return nil, errors.New("can not get Packets")
}
func newFile(b []byte) (*os.File, error) {
log.Println("len(b):", len(b))
fp, err := ioutil.TempFile("./", "snapshot_")
if err != nil {
return nil, err
}
defer fp.Close()
n, err := fp.Write(b)
log.Println(n, "written to", fp.Name())
if err != nil {
return nil, err
} else {
return fp, nil
}
}
func main() {
// runtime.GOMAXPROCS(runtime.NumCPU())
src := []string{"tmp/vid480.mp4", "tmp/vid481.mp4", "tmp/vid482.mp4", "tmp/vid483.mp4", "tmp/vid484.mp4", "tmp/vid485.mp4"}
wg := new(sync.WaitGroup)
for _, url := range src {
wg.Add(1)
go func(url string) {
fp, err := Grab(url, wg)
log.Println(fp, err)
}(url)
}
wg.Wait()
}
from gmf.
Related Issues (20)
- SeekFrameAt doesn't seem to work HOT 2
- Is there a way to convert a mjpeg stream to h264 video?
- Removing location metadata HOT 1
- How Can I move mp4 moov , ( fastStart ) HOT 2
- Windows10, Resource temporarily unavailable HOT 5
- how to get a gif picture from the video?
- Invalid NAL unit size (556795136 > 367).
- Go Image to mp4
- ../format_go112.go:287:26: ctx.avCtx.filename undefined (type *_Ctype_struct_AVFormatContext has no field or method filename) HOT 4
- install error
- [question] example encoding-multiple mpeg4 can't play HOT 1
- [Go-1.18] unable to instal gmf with `go install` HOT 3
- memory leak HOT 1
- Not compatible with latest ffmpeg-5.1 HOT 1
- go.mod incorrect cannot download module HOT 2
- Chromakey Filter HOT 2
- Error handling HOT 3
- Compilation error: could not determine kind of name for C.AV_FRAME_DATA_FILM_GRAIN_PARAMS HOT 3
- Do not use constant syscall.EAGAIN
- `NewAudioFrame` has memory leak bug
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gmf.