deepch / vdk

A set of libraries for building streaming services. RTSP RTMP MP4 WS TS DASH WEBRTC MP4f

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

获取rtsp流,保存mp4文件。生成的文件不能显示视频,但能显示时间。请问这是怎么回事?代码如下

moonfdd opened this issue · comments

package main

import (
	"fmt"
	"os"
	"time"

	"github.com/deepch/vdk/format/mp4"
	"github.com/deepch/vdk/format/rtspv2"
)

func main() {
	c, err := rtspv2.Dial(rtspv2.RTSPClientOptions{URL: "rtsp://admin:DSYmaster@172.16.11.191:554/LiveMedia/ch1/Media2", DisableAudio: true, DialTimeout: 3 * time.Second, ReadWriteTimeout: 3 * time.Second, Debug: false})
	if err != nil {
		fmt.Println("失败", err)
		return
	}
	defer c.Close()
	fmt.Println("连接成功")
	fmt.Println(c.CodecData[0].Type())

	f, err2 := os.Create("./test.mp4")
	if err2 != nil {
		fmt.Println("创建文件失败", err2)
		return
	}
	defer f.Close()

	m := mp4.NewMuxer(f)
	err = m.WriteHeader(c.CodecData)
	if err != nil {
		fmt.Println("WriteHeader失败", err)
		return
	} else {
		fmt.Println("WriteHeader成功")
	}
	i := 0
	for {
		select {
		case signals := <-c.Signals:
			fmt.Println("信号:", signals)
			switch signals {
			case rtspv2.SignalCodecUpdate:
				fmt.Println("开始")

			case rtspv2.SignalStreamRTPStop:
				return
			}
		case packetAV := <-c.OutgoingPacketQueue:
			fmt.Println("数据:", packetAV.IsKeyFrame, i)
			i++
			err = m.WritePacket(*packetAV)
			if err != nil {
				fmt.Println("WritePacket失败", err)
				return
			} else {
				fmt.Println(packetAV.CompositionTime)
				fmt.Println(packetAV.Duration)
				fmt.Println(packetAV.Idx)
				fmt.Println(packetAV.IsKeyFrame)
				fmt.Println(packetAV.Time)
				fmt.Println("WritePacket成功", len(packetAV.Data))
			}
		}
		if i >= 251 {
			break
		}
	}
	m.WriteTrailer()
	fmt.Println("WriteTrailer成功")
	fmt.Println("结束")

	fmt.Println("")
}

image
image

用vlc播放视频文件,看不到画面,但能看到时间。看文件大小,明显不对。是不是代码写得有问题?谢谢了。