1 fix sdp parse error(atoi error)

2 delete timeout when udp pushing
pull/132/head
macbookpro 2018-12-08 14:50:21 +08:00
parent 7c2e551dc3
commit 1f63dbda20
3 changed files with 22 additions and 7 deletions

View File

@ -2,7 +2,6 @@ package rtsp
import ( import (
"fmt" "fmt"
"github.com/penggy/EasyGoLib/utils"
"log" "log"
"net" "net"
"os" "os"
@ -12,6 +11,8 @@ import (
"sync" "sync"
"syscall" "syscall"
"time" "time"
"github.com/penggy/EasyGoLib/utils"
) )
type Server struct { type Server struct {
@ -82,12 +83,15 @@ func (server *Server) Start() (err error) {
log.Printf("EnsureDir:[%s] err:%v.", dir, err) log.Printf("EnsureDir:[%s] err:%v.", dir, err)
continue continue
} }
path := path.Join(dir, fmt.Sprintf("out.m3u8")) m3u8path := path.Join(dir, fmt.Sprintf("out.m3u8"))
// ffmpeg -i ~/Downloads/720p.mp4 -s 640x360 -g 15 -c:a aac -hls_time 5 -hls_list_size 0 record.m3u8 // ffmpeg -i ~/Downloads/720p.mp4 -s 640x360 -g 15 -c:a aac -hls_time 5 -hls_list_size 0 record.m3u8
cmd := exec.Command(ffmpeg, "-fflags", "genpts", "-rtsp_transport", "tcp", "-i", pusher.URL(), "-c:v", "copy", "-hls_time", strconv.Itoa(ts_duration_second), "-hls_list_size", "0", path) cmd := exec.Command(ffmpeg, "-fflags", "genpts", "-rtsp_transport", "tcp", "-i", pusher.URL(), "-c:v", "copy", "-hls_time", strconv.Itoa(ts_duration_second), "-hls_list_size", "0", m3u8path)
cmd.Stdout = os.Stdout f, err := os.OpenFile(path.Join(dir, fmt.Sprintf("log.txt")), os.O_RDWR|os.O_CREATE, 0755)
cmd.Stderr = os.Stderr if err == nil {
cmd.Stdout = f
cmd.Stderr = f
}
err = cmd.Start() err = cmd.Start()
if err != nil { if err != nil {
log.Printf("Start ffmpeg err:%v", err) log.Printf("Start ffmpeg err:%v", err)
@ -106,7 +110,15 @@ func (server *Server) Start() (err error) {
if proc != nil { if proc != nil {
log.Printf("prepare to SIGTERM to process:%v", proc) log.Printf("prepare to SIGTERM to process:%v", proc)
proc.Signal(syscall.SIGTERM) proc.Signal(syscall.SIGTERM)
proc.Wait()
// proc.Kill() // proc.Kill()
// no need to close attached log file.
// see "Wait releases any resources associated with the Cmd."
// if closer, ok := cmd.Stdout.(io.Closer); ok {
// closer.Close()
// log.Printf("process:%v Stdout closed.", proc)
// }
log.Printf("process:%v terminate.", proc)
} }
delete(pusher2ffmpegMap, pusher) delete(pusher2ffmpegMap, pusher)
log.Printf("delete ffmpeg from pull stream from pusher[%v]", pusher) log.Printf("delete ffmpeg from pull stream from pusher[%v]", pusher)

View File

@ -375,6 +375,8 @@ func (session *Session) handleRequest(req *Request) {
} }
} else if udpMatchs := mudp.FindStringSubmatch(ts); udpMatchs != nil { } else if udpMatchs := mudp.FindStringSubmatch(ts); udpMatchs != nil {
session.TransType = TRANS_TYPE_UDP session.TransType = TRANS_TYPE_UDP
// no need for tcp timeout.
session.Conn.timeout = 0
if session.UDPClient == nil { if session.UDPClient == nil {
session.UDPClient = &UDPClient{ session.UDPClient = &UDPClient{
Session: session, Session: session,

View File

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"io" "io"
"strconv" "strconv"
"strings"
"time" "time"
) )
@ -199,11 +200,11 @@ func (d *Decoder) rtpmap(f *Format, v string) error {
f.Name = p[0] f.Name = p[0]
var err error var err error
if ok { if ok {
if f.Channels, err = strconv.Atoi(p[2]); err != nil { if f.Channels, err = strconv.Atoi(strings.TrimSpace(p[2])); err != nil {
return err return err
} }
} }
if f.ClockRate, err = strconv.Atoi(p[1]); err != nil { if f.ClockRate, err = strconv.Atoi(strings.TrimSpace(p[1])); err != nil {
return err return err
} }
return nil return nil