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 | 这个的运行根据这个流程来 |