mirror of
https://github.com/pion/webrtc.git
synced 2025-10-04 14:53:05 +08:00
Move IVFWriter to pkg
Allow this to be used/improved by others. SampleBuilder will be a sibling Resolves #115
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
||||
|
||||
"github.com/pions/webrtc"
|
||||
"github.com/pions/webrtc/pkg/ice"
|
||||
"github.com/pions/webrtc/pkg/media/ivfwriter"
|
||||
)
|
||||
|
||||
func main() {
|
||||
@@ -49,12 +50,14 @@ func main() {
|
||||
peerConnection.Ontrack = func(track *webrtc.RTCTrack) {
|
||||
if track.Codec.Name == webrtc.VP8 {
|
||||
fmt.Println("Got VP8 track, saving to disk as output.ivf")
|
||||
i, err := newIVFWriter("output.ivf")
|
||||
i, err := ivfwriter.New("output.ivf")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
for {
|
||||
i.addPacket(<-track.Packets)
|
||||
if err := i.AddPacket(<-track.Packets); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
package main
|
||||
package ivfwriter
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
@@ -9,19 +9,15 @@ import (
|
||||
"github.com/pions/webrtc/pkg/rtp/codecs"
|
||||
)
|
||||
|
||||
type ivfWriter struct {
|
||||
// IVFWriter is used to take RTP packets and write them to an IVF on disk
|
||||
type IVFWriter struct {
|
||||
fd *os.File
|
||||
count uint64
|
||||
currentFrame []byte
|
||||
}
|
||||
|
||||
func panicWrite(fd *os.File, data []byte) {
|
||||
if _, err := fd.Write(data); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func newIVFWriter(fileName string) (*ivfWriter, error) {
|
||||
// New builds a new IVF writer
|
||||
func New(fileName string) (*IVFWriter, error) {
|
||||
f, err := os.Create(fileName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -39,27 +35,29 @@ func newIVFWriter(fileName string) (*ivfWriter, error) {
|
||||
binary.LittleEndian.PutUint32(header[24:], 900) // Frame count
|
||||
binary.LittleEndian.PutUint32(header[28:], 0) // Unused
|
||||
|
||||
panicWrite(f, header)
|
||||
|
||||
i := &ivfWriter{fd: f}
|
||||
return i, nil
|
||||
if _, err := f.Write(header); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func (i *ivfWriter) addPacket(packet *rtp.Packet) {
|
||||
return &IVFWriter{fd: f}, nil
|
||||
}
|
||||
|
||||
// AddPacket adds a new packet and writes the appropriate headers for it
|
||||
func (i *IVFWriter) AddPacket(packet *rtp.Packet) error {
|
||||
|
||||
vp8Packet := codecs.VP8Packet{}
|
||||
err := vp8Packet.Unmarshal(packet)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return err
|
||||
}
|
||||
|
||||
i.currentFrame = append(i.currentFrame, vp8Packet.Payload[0:]...)
|
||||
|
||||
if !packet.Marker {
|
||||
return
|
||||
return nil
|
||||
} else if len(i.currentFrame) == 0 {
|
||||
fmt.Println("skipping")
|
||||
return
|
||||
return nil
|
||||
}
|
||||
|
||||
frameHeader := make([]byte, 12)
|
||||
@@ -68,8 +66,12 @@ func (i *ivfWriter) addPacket(packet *rtp.Packet) {
|
||||
|
||||
i.count++
|
||||
|
||||
panicWrite(i.fd, frameHeader)
|
||||
panicWrite(i.fd, i.currentFrame)
|
||||
if _, err := i.fd.Write(frameHeader); err != nil {
|
||||
return err
|
||||
} else if _, err := i.fd.Write(i.currentFrame); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
i.currentFrame = nil
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user