NFD-C-player整体流程
整体流程:
player
端通过解析命令行输入的video
名字得到兴趣包的prefix
和video_name
,有了prefix
之后,首先需要创建一个app_face
,创建app_face
同时创建了其对应的套接字等信息,然后通过connect
函数与player-server
端建立连接。就可以通过sendDiscoverInterest(app_face, prefix);
发送兴趣包,这个兴趣包的作用是在server端根据视频的大小获取为了获取视频需要发送的兴趣包个数。
sendDiscoverInterest(app_face, prefix);
首先明确的interest
信息,然后通过express_interest
维护app_face
的PIT
表,,将interest
的名字作为键,内容作为值存在哈希表里。以及通过app_face_send
发送interest
数据。这个函数涉及到了回调函数。回调函数为onDisvoverData()
,express_interest
还将回调函数存在PIT中。通过这个函数就可以获取需要的兴趣包个数。(server
端对DiscoverInterest
的处理是返回interest
为名字,需要的用于获取视频的兴趣包的个数为data
包的value
),记为max_seq_num
,然后调用getContentInterest
函数,这个函数又调用了pipelineInterest
函数,用于获取视频内容并保存,实际上就是根据需要多少兴趣包获取视频,通过express_interest
依次发送兴趣包,发送兴趣包时调用回调函数on_segment_data
对返回的数据包进行处理,on_segment_data
又调用了writeInOrderData
函数,这个函数用于将data数据包写到信道中,这样在player
端就可以直接读了。
在express_interest
之后,sendDiscoverInterest
执行process_events
;其主要作用是不断更新app_face
的buffer
,有数据来了就放在buffer
中,然后将buffer
的数据存在recvmsg
中,然后通过handle_msg
函数recvmsg
再进行下一步处理,由于player
接收到数据包,如果能在PIT表中找到data_name
,(原来存入了interest_name
,interest_name
和data_name
一样,都是/video/videoname/segment/i
或者是/video/videoname//discovery
的形式),而且表项的回调函数也在这个表项中,就执行回调函数,也就是执行onDisvoverData()
,通过流水线获取data数据,获取完数据之后,最后需要擦除这个PIT中的表项。
server
端通过命令行输入前缀并解析得到前缀,然后需要创建一个app_face
,创建app_face
同时创建了其对应的套接字等信息,然后通过connect
函数与player
端建立连接。然后通过set_interest_filter()
对interest
进行过滤,这里调用了一个回调函数processReceivedInterest
,判断interest
包是discovery
包还是segment
包。如果是discovery
包就返回player
端一个包含有需要的用于获取视频的兴趣包的个数的数据包,如果是segment
包就将视频的信息分成若干个data
包,然后通过put
函数对数据包进行tlv编码然后通过app_face_send
发送数据包,app_face_send
函数底层调用了write
函数。
视频播放的指令:
1 | 客户端 |
NFD-C视频播放不出来时需要转换一下格式
1 | sudo apt install ffmpeg |
NFD视频播放配置
1 | 这个的运行根据这个流程来 |