zhangpeihao / gortmp

Implement RTMP protocol by golang
MIT License
523 stars 162 forks source link

player的demo 无法正常获取数据 #17

Open xiangxixids opened 8 years ago

xiangxixids commented 8 years ago

用player 的那个demo 做测试, 发现每次只能收获前面两次数据: 发现最后是conn.br.ReadByte()无数据, 我的测试视频源应该是没问题的, 用LVC 能正常播放. 想请教一下, 什么情况可能造成这个问题?

具体停止的位置,

ReadBaseHeader 这个方法中:

b, err = ReadByteFromNetwork(rbuf) 这里卡住了

另外有一个疑问, 我第二次收到的command 正确么? 请帮忙看看, 谢谢

=====以下是运行的log====

to dial obConn: &{url:rtmp://XXX:1935/myapp/tt_friends?vhost=tt rtmpURL:{protocol:rtmp host:XXX port:1935 app:myapp instanceName:tt_friends?vhost=tt} status:1 err:?reflect.Value? handler:0x7a1e90 conn:0xc208080100 transactions:map[] streams:map[]} obConn.URL(): rtmp://XXXX:1935/myapp/tt_friends?vhost=tt to connect sendLoop here sendLoop here conn.br: func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 2 func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 5 conn.br: func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 2 func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 6 conn.br: func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 2 func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 1 conn.br: func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 3 func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 20 @@@@@@@@@@@@@status: 3, err: ReceviedCommand: &{IsFlex:false Name:_result TransactionID:1 Objects:[map[fmsVer:FMS/3,0,1,123 capabilities:31] map[code:NetConnection.Connect.Success description:Connection succeeded. objectEncoding:0 data:map[server_pid:7253 stream_id:14485083201515715713 server_ip:100.69.198.197 server_name:e100069198197.zmf] level:status]]} conn.br: func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: sendLoop here sendLoop here read header 01 3 func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 20 @@@@@@@@@@@@@status: 5, err: Stream created: 1 ReceviedCommand: &{IsFlex:false Name:_result TransactionID:2 Objects:[ 1]} conn.br: func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: play here &{1 0xc2080520a0 8 ?reflect.Value? 0} sendLoop here sendLoop here read header 01 5 func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 20 OnReceived conn.br: func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 5 func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: read header 01 18 OnReceived conn.br: func ReadByteFromNetwork(r Reader) (b byte, err error) read header 0: Audio size: 0 bytes; Vedio size: 0 bytes sendLoop here Audio size: 0 bytes; Vedio size: 0 bytes sendLoop here Audio size: 0 bytes; Vedio size: 0 bytes sendLoop here Audio size: 0 bytes; Vedio size: 0 bytes sendLoop here

zhangpeihao commented 8 years ago

服务器用的是哪个啊?

xiangxixids commented 8 years ago

内部搭建的服务器, rtmp://XXXXXX:1935/myapp/tt_friends?vhost=tt
或者你提供我一个能用的服务器地址, 我换你的地址测试一下?

xiangxixids commented 8 years ago

我找了个公共测试的地址: rtmp://live.hkstv.hk.lxdns.com/live/hks 这个一样有问题, 麻烦看一下呢.

hy05190134 commented 8 years ago

@xiangxixids ./rtmp_player -Stream="hks" -URL="rtmp://live.hkstv.hk.lxdns.com/live" -DumpFLV="ab.flv" 我本地测试可以拉到数据并写入 flv 文件

programmerZhou commented 7 years ago

我测试过程中也发现了,使用vlc播放,只能播放前面几帧,最后读出flv的每个tag,发现tag的时间戳都是一样的,跟踪代码发现demp/rtmp_player.go 文件的第53行和58行中的第二个参数应该填message.AbsoluteTimestamp而不是message.Timestamp。 下面这行代码是第53行的代码。

flvFile.WriteVideoTag(message.Buf.Bytes(), message.Timestamp)

hy05190134 commented 7 years ago

@programmerZhou flv 的时间戳是不是还需要调整的?直接可以用 absoluteTimestamp

programmerZhou commented 7 years ago

@hy05190134 是不是需要调整我没有仔细看实现代码,可能不调整会有一些不同步吧。但是使用absoluteTimestamp,保存下来的flv文件是可以被vlc播放的。 而使用timestamp(该字段可能存的是时间戳增量),在存成flv文件后会导致flv tag的时间戳错误,从而导致flv文件无法播放。下面是我打印的flv文件的tag header信息(使用timestamp)。 header timestamp is 231962, length of data is 4819, tag type is 9, tag data size is 4819 header timestamp is 231962, length of data is 521, tag type is 8, tag data size is 521 header timestamp is 231962, length of data is 689, tag type is 9, tag data size is 689 header timestamp is 231962, length of data is 525, tag type is 8, tag data size is 525 header timestamp is 231962, length of data is 2245, tag type is 9, tag data size is 2245 header timestamp is 231962, length of data is 548, tag type is 8, tag data size is 548 header timestamp is 231962, length of data is 11687, tag type is 9, tag data size is 11687 header timestamp is 231962, length of data is 516, tag type is 8, tag data size is 516 header timestamp is 231962, length of data is 5103, tag type is 9, tag data size is 5103 header timestamp is 231962, length of data is 534, tag type is 8, tag data size is 534 header timestamp is 231962, length of data is 864, tag type is 9, tag data size is 864 header timestamp is 231962, length of data is 2667, tag type is 9, tag data size is 2667 header timestamp is 231962, length of data is 523, tag type is 8, tag data size is 523 header timestamp is 231962, length of data is 12829, tag type is 9, tag data size is 12829 header timestamp is 231962, length of data is 554, tag type is 8, tag data size is 554 header timestamp is 231962, length of data is 5396, tag type is 9, tag data size is 5396 header timestamp is 231962, length of data is 519, tag type is 8, tag data size is 519 header timestamp is 231962, length of data is 896, tag type is 9, tag data size is 896 header timestamp is 231962, length of data is 524, tag type is 8, tag data size is 524 header timestamp is 231962, length of data is 3466, tag type is 9, tag data size is 3466 header timestamp is 231962, length of data is 528, tag type is 8, tag data size is 528 header timestamp is 231962, length of data is 12246, tag type is 9, tag data size is 12246 header timestamp is 231962, length of data is 529, tag type is 8, tag data size is 529 header timestamp is 231962, length of data is 5433, tag type is 9, tag data size is 5433 header timestamp is 231962, length of data is 2995, tag type is 9, tag data size is 2995 header timestamp is 231962, length of data is 525, tag type is 8, tag data size is 525 header timestamp is 231962, length of data is 2652, tag type is 9, tag data size is 2652 header timestamp is 231962, length of data is 521, tag type is 8, tag data size is 521 header timestamp is 231962, length of data is 9135, tag type is 9, tag data size is 9135 header timestamp is 231962, length of data is 527, tag type is 8, tag data size is 527 header timestamp is 231962, length of data is 717, tag type is 9, tag data size is 717 header timestamp is 231962, length of data is 527, tag type is 8, tag data size is 527 header timestamp is 231962, length of data is 2269, tag type is 9, tag data size is 2269 header timestamp is 231962, length of data is 524, tag type is 8, tag data size is 524

programmerZhou commented 7 years ago

@hy05190134 使用absoluteTimestamp的flv文件的tag header信息 header timestamp is 11793892, length of data is 657, tag type is 9, tag data size is 657 header timestamp is 11793932, length of data is 2231, tag type is 9, tag data size is 2231 header timestamp is 11793935, length of data is 508, tag type is 8, tag data size is 508 header timestamp is 11793972, length of data is 26845, tag type is 9, tag data size is 26845 header timestamp is 11793982, length of data is 509, tag type is 8, tag data size is 509 header timestamp is 11794012, length of data is 2936, tag type is 9, tag data size is 2936 header timestamp is 11794028, length of data is 506, tag type is 8, tag data size is 506 header timestamp is 11794052, length of data is 2893, tag type is 9, tag data size is 2893 header timestamp is 11794075, length of data is 512, tag type is 8, tag data size is 512 header timestamp is 11794092, length of data is 17302, tag type is 9, tag data size is 17302 header timestamp is 11794121, length of data is 507, tag type is 8, tag data size is 507 header timestamp is 11794132, length of data is 6076, tag type is 9, tag data size is 6076 header timestamp is 11794167, length of data is 507, tag type is 8, tag data size is 507 header timestamp is 11794172, length of data is 2778, tag type is 9, tag data size is 2778 header timestamp is 11794212, length of data is 3527, tag type is 9, tag data size is 3527 header timestamp is 11794214, length of data is 522, tag type is 8, tag data size is 522 header timestamp is 11794252, length of data is 4236, tag type is 9, tag data size is 4236 header timestamp is 11794260, length of data is 519, tag type is 8, tag data size is 519 header timestamp is 11794292, length of data is 5855, tag type is 9, tag data size is 5855 header timestamp is 11794307, length of data is 524, tag type is 8, tag data size is 524 header timestamp is 11794332, length of data is 14722, tag type is 9, tag data size is 14722 header timestamp is 11794353, length of data is 531, tag type is 8, tag data size is 531 header timestamp is 11794372, length of data is 4731, tag type is 9, tag data size is 4731 header timestamp is 11794400, length of data is 538, tag type is 8, tag data size is 538 header timestamp is 11794412, length of data is 3477, tag type is 9, tag data size is 3477 header timestamp is 11794446, length of data is 526, tag type is 8, tag data size is 526 header timestamp is 11794452, length of data is 3435, tag type is 9, tag data size is 3435 header timestamp is 11794492, length of data is 616, tag type is 9, tag data size is 616 header timestamp is 11794492, length of data is 526, tag type is 8, tag data size is 526 header timestamp is 11794532, length of data is 27032, tag type is 9, tag data size is 27032 header timestamp is 11794539, length of data is 503, tag type is 8, tag data size is 503 header timestamp is 11794572, length of data is 13235, tag type is 9, tag data size is 13235 header timestamp is 11794585, length of data is 575, tag type is 8, tag data size is 575 header timestamp is 11794612, length of data is 6524, tag type is 9, tag data size is 6524 header timestamp is 11794632, length of data is 528, tag type is 8, tag data size is 528 header timestamp is 11794652, length of data is 461, tag type is 9, tag data size is 461 header timestamp is 11794678, length of data is 511, tag type is 8, tag data size is 511 header timestamp is 11794692, length of data is 5311, tag type is 9, tag data size is 5311 header timestamp is 11794725, length of data is 517, tag type is 8, tag data size is 517 header timestamp is 11794732, length of data is 11095, tag type is 9, tag data size is 11095 header timestamp is 11794771, length of data is 557, tag type is 8, tag data size is 557

programmerZhou commented 7 years ago

@hy05190134 为什么使用timestamp会导致所有tag的时间戳相同的原因。

  1. github.com/zhangpeihao/goflv/flv.go文件中关于WriteTag的实现:
116 func (flvFile *File) WriteTag(data []byte, tagType byte, timestamp uint32) (err error) {
117     if timestamp < flvFile.lastTimestamp {
118         timestamp = flvFile.lastTimestamp
119     } else {   
  1. 在outboundconn.go文件的269行后插入打印语句,如下:
266 func (obConn *outboundConn) OnReceived(conn Conn, message *Message) {
267     stream, found := obConn.streams[message.StreamID]
268     if found {
269         if !stream.Received(message) {
270             fmt.Printf("message.Timestamp is %d, message.AbsoluteTimestamp is %d\n",
271                 message.Timestamp,
272                 message.AbsoluteTimestamp)
273             obConn.handler.OnReceived(conn, message)
274         }
275     } else {
276         obConn.handler.OnReceived(conn, message)
277     }
278 }   

终端输入log如下:

message.Timestamp is 0, message.AbsoluteTimestamp is 100108
message.Timestamp is 0, message.AbsoluteTimestamp is 100108
message.Timestamp is 0, message.AbsoluteTimestamp is 100108
message.Timestamp is 40, message.AbsoluteTimestamp is 100148
message.Timestamp is 40, message.AbsoluteTimestamp is 100188
message.Timestamp is 100141, message.AbsoluteTimestamp is 100141
message.Timestamp is 47, message.AbsoluteTimestamp is 100188
message.Timestamp is 40, message.AbsoluteTimestamp is 100228
message.Timestamp is 46, message.AbsoluteTimestamp is 100234
message.Timestamp is 40, message.AbsoluteTimestamp is 100268
message.Timestamp is 47, message.AbsoluteTimestamp is 100281
message.Timestamp is 40, message.AbsoluteTimestamp is 100308
message.Timestamp is 46, message.AbsoluteTimestamp is 100327
message.Timestamp is 40, message.AbsoluteTimestamp is 100348
message.Timestamp is 46, message.AbsoluteTimestamp is 100373
message.Timestamp is 40, message.AbsoluteTimestamp is 100388
message.Timestamp is 47, message.AbsoluteTimestamp is 100420
message.Timestamp is 40, message.AbsoluteTimestamp is 100428
message.Timestamp is 46, message.AbsoluteTimestamp is 100466
message.Timestamp is 40, message.AbsoluteTimestamp is 100468
message.Timestamp is 40, message.AbsoluteTimestamp is 100508
message.Timestamp is 47, message.AbsoluteTimestamp is 100513
message.Timestamp is 40, message.AbsoluteTimestamp is 100548
message.Timestamp is 46, message.AbsoluteTimestamp is 100559
message.Timestamp is 40, message.AbsoluteTimestamp is 100588     

由上面的1和2可以得到为什么使用timestamp会导致flv文件的tag header中的时间戳都一样了。 使用AbsoluteTimestamp是否可以直接用,会不会有不同步的问题,我有空仔细在阅读相关代码,给出确定结论。 注: github.com/zhangpeihao/goflv这个项目已经在github.com上找不到了。

hy05190134 commented 7 years ago

@programmerZhou 你给的分析很详细,不过我之前可能只是写入,没有测试 vlc 播放,有空再看看 flv 协议把