
»ùÓÚGStreamerµÄSmooth Streaming²å¼þ¿ª·¢
¢Étrun¡£¸ÃboxÖдæ·ÅµÄΪ¸ÃFragmentÊý¾ÝÖÐÿ¸ösampleµÄ´óС¡¢Æ«ÒÆÊ±¼ä¡¢³ÖÐøÊ±¼äºÍÊôÐÔÉèÖá£
¢Êsdtp¡£¸ÃboxÖÐûÓÐÄÚÈÝ£¬Ö»ÊÇÓÃÀ´±íʾԴÊý¾ÝµÄ½áÊø¡£
¢Ëmdat¡£¸ÃboxΪһ¸öµ¥¶ÀµÄÊý¾Ýbox£¬Ö÷Òª´æ´¢¸ÃFragmentÊý¾ÝÖеÄËùÓÐsampleÊý¾ÝÄÚÈÝ¡£
µÚËÄÕ »ùÓÚGStreamerµÄSmooth StreamingÐÒéµÄ²å¼þ¿ª·¢
4.1 socketͨÐÅÐÒéÉè¼ÆÊµÏÖ 4.1.1 socketµÄ¸ÅÄî
SocketÊǽ¨Á¢ÔÚ´«Êä²ãÐÒ飨Ö÷ÒªÊÇTCPÓëUDP£©ÉϵÄÒ»ÖÖÌ×½Ó×ֹ淶£¬×î³õÊÇÓÉÃÀ¹úµÄ¼ÓÖÝBerkley´óѧÌá³ö£¬ÎªUNIXϵͳ¿ª·¢µÄÍøÂçͨÐŽӿڡ£Ëü¶¨ÒåÁËÁ½Ì¨¼ÆËã»úÖ®¼äͨÐŵĹ淶£¬socketÆÁ±ÎÁ˵ײãͨÐÅÔª¼þºÍ¾ßÌå²Ù×÷ϵͳµÄ²îÒ죬ʹµÃÈÎÒâÁ½Ì¨°²×°ÁËTCPÐÒéÈí¼þºÍʵÏÖÁËsocket¹æ·¶µÄ¼ÆËã»úÖ®¼äµÄͨÐųÉΪ¿ÉÄÜ¡£·¢Õ¹ÖÁĿǰ£¬socketÍøÂç½Ó¿ÚÒѾ·¢Õ¹³ÉΪTCP/IPÍøÂç×îΪͨÓõÄÍøÂç½Ó¿Ú¡£
4.1.2 socketµÄ·ÖÀà
Linuxϵͳ֧³Ö¶àÖÖÌ×½Ó×ÖÀàÐÍ£¬Ö÷ÒªÓÐÒÔÏÂ3 ÖÖ£º
1)Á÷ʽÌ×½Ó×Ö(SOCK_STREAM)£º ÕâÊÇ×î³£ÓõÄÌ×½Ó×ÖÀàÐÍ¡£TCP ÐÒéʹÓôËÀà½Ó¿Ú£¬ËüÌá¹©ÃæÏòÁ¬½ÓµÄ¡¢ÎÞ²î´íµÄÍøÂçÐÅÏ¢°üµÄ´«Êä¡£
2)Êý¾Ý±¨Ì×½Ó×Ö(SOCK_DGRAM)£ºUDPÐÒéʹÓôËÀà½Ó¿Ú£¬ËüÊÇÎÞÁ¬½ÓµÄ·þÎñ£¬ÒÔ¶ÀÁ¢µÄÊý¾Ý±¨½øÐÐÍøÂç´«Êä¡£Êý¾Ý±¨µÄ×î´ó³¤¶ÈΪ32KB£¬´«Êä²»±£Ö¤Ë³ÐòÐÔ¡¢¿É¿¿ÐÔºÍÎÞÖØ¸´ÐÔ£¬Ëüͨ³£ÓÃÓÚµ¥¸ö±¨ÎÄ´«Êä»ò¿É¿¿ÐÔ²»ÖØÒªµÄ³¡ºÏ¡£
3)ÔʼÌ×½Ó×Ö(SOCK_RAW)£ºÌṩ¶ÔÍøÂçϲãͨÐÅÐÒé(ÈçIP ÐÒé)µÄÖ±½Ó·Ã
27
»ùÓÚGStreamerµÄSmooth Streaming²å¼þ¿ª·¢
ÎÊ£¬ËüÒ»°ã²»ÊÇÌṩ¸øÆÕͨÓû§µÄ£¬²¢Ö÷ÒªÓÃÓÚ¿ª·¢ÐµÄÐÒé»òÓÃÓÚÌáÈ¡ÐÒé½ÏÒþ±ÎµÄ¹¦ÄÜ¡£
4.1.3 socketµÄÉè¼Æ¹ý³Ì
Ì×½Ó×Ö±à³Ì¾ù²ÉÓÿͻ§»ú/·þÎñÆ÷£¨C/S£©µÄÐ×÷ģʽ£¬¼´Óɿͻ§½ø³ÌÏò·þÎñÆ÷½ø³Ì·¢³öÇëÇ󣬷þÎñÆ÷½ø³ÌÖ´Ðб»ÇëÇóµÄÈÎÎñ²¢½«ÏìÓ¦½á¹û·µ»Ø¸ø¿Í»§½ø³Ì¡£±¾ÎĹ¹½¨µÄsocketͨÐÅÐÒéÉè¼ÆÈçͼ4-1Ëùʾ£º
ͼ4-1 socketͨÐÅÐÒéÁ÷³Ì
4.1.4 ·Ç×èÈûsocketµÄÉè¼Æ¹ý³Ì
×èÈûģʽÓë·Ç×èÈûģʽµÄ×î´óÇø±ðÔÚÓÚµ±ÎÞÇëÇóʱ£¬×èÈûģʽ»áһֱͣÁôÔÚº¯ÊýÖУ¬¶ø·Ç×èÈûģʽÔò»á¸ù¾Ýʵ¼ÊµÄÇé¿ö½øÐд¦Àí£¬ÌØ±ðÊÇÔÚ½ÓÊÜÊý¾Ý»ò·¢ËÍÊý¾Ýʱ¡£ÒòΪ±¾ÎĽ«Òª´Ó·þÎñÆ÷ÖÐÏÂÔØ±È½Ï´óµÄÊý¾Ý£¬ÐèÒª·ÖÅúÏÂÔØ£¬Òª¿¼Âǵ½Êý¾Ý½ÓÊܵÄÍêÕûÐÔËùÒÔÑ¡Ó÷Ç×èÈû·½Ê½¡£·Ç×èÈû·½Ê½µÄʵÏÖÖ»ÊÇÔÚ×èÈûģʽϼÓ
28
»ùÓÚGStreamerµÄSmooth Streaming²å¼þ¿ª·¢
ÈëÈçϵÄÉèÖü´¿É£º
1.µ÷ÓÃfcntl()º¯ÊýÉèÖÃsocketΪ·Ç×èÈûģʽ£¬¾ßÌåµ÷ÓÃÈçͼ4-2Ëùʾ£º
ͼ4-2 fcntlº¯Êýµ÷Ó÷½·¨
2.ÔÚread()ºÍrecv()º¯ÊýÖнøÐÐÊʵ±µØ´¦ÀíÅжϴ¦Àí£¬¾ßÌåʵÏÖÈçͼ4-3Ëùʾ£º
ͼ4-3 ·Ç×èÈûrecvº¯ÊýʵÏÖ
4.2 HTTPͨÐÅÐÒéÉè¼ÆÊµÏÖ 4.2.1 HTTPÏà¹Ø¸ÅÄî
HTTPÊÇÒ»¸öÊôÓÚÓ¦ÓòãµÄÃæÏò¶ÔÏóµÄÐÒ飬ÓÉÓÚÆä¼ò½Ý¡¢¿ìËٵķ½Ê½£¬ÊÊÓÃÓÚ·Ö²¼Ê½³¬Ã½ÌåÐÅϢϵͳ¡£ËüÓÚ1990 ÄêÌá³ö£¬¾¹ý¼¸ÄêµÄʹÓÃÓë·¢Õ¹£¬µÃµ½²»¶ÏµØÍêÉÆºÍÀ©Õ¹¡£Ä¿Ç°ÔÚWWWÖÐʹÓõÄÊÇHTTP/1.0µÄµÚÁù°æ£¬HTTP/1.1µÄ¹æ·¶»¯¹¤×÷ÕýÔÚ½øÐÐÖ®ÖУ¬¶øÇÒHTTP-NG(Next Generation of HTTP)µÄ½¨ÒéÒѾÌá³ö¡£
4.2.2 HTTPͨÐÅÐÒéµÄÌØµã
1.Ö§³Ö¿Í»§/·þÎñÆ÷ģʽ¡£
2.¼òµ¥¿ìËÙ£º¿Í»§Ïò·þÎñÆ÷ÇëÇó·þÎñʱ£¬Ö»Ðè´«ËÍÇëÇó·½·¨ºÍ·¾¶¡£ÇëÇó·½
29
»ùÓÚGStreamerµÄSmooth Streaming²å¼þ¿ª·¢
·¨³£ÓõÄÓÐGET¡¢HEAD¡¢POST¡£Ã¿ÖÖ·½·¨¹æ¶¨Á˿ͻ§Óë·þÎñÆ÷ÁªÏµµÄÀàÐͲ»Í¬¡£ÓÉÓÚHTTPÐÒé¼òµ¥£¬Ê¹µÃHTTP·þÎñÆ÷µÄ³ÌÐò¹æÄ£Ð¡£¬Òò¶øÍ¨ÐÅËٶȺܿ졣
3.Áé»î£ºHTTPÔÊÐí´«ÊäÈÎÒâÀàÐ͵ÄÊý¾Ý¶ÔÏó¡£ÕýÔÚ´«ÊäµÄÀàÐÍÓÉContent-Type ¼ÓÒÔ±ê¼Ç¡£
4.ÎÞÁ¬½Ó£ºÎÞÁ¬½ÓµÄº¬ÒåÊÇÏÞÖÆÃ¿´ÎÁ¬½ÓÖ»´¦ÀíÒ»¸öÇëÇó¡£·þÎñÆ÷´¦ÀíÍê¿Í»§µÄÇëÇ󣬲¢ÊÕµ½¿Í»§µÄÓ¦´ðºó£¬¼´¶Ï¿ªÁ¬½Ó¡£²ÉÓÃÕâÖÖ·½Ê½¿ÉÒÔ½ÚÊ¡´«Êäʱ¼ä¡£
5.ÎÞ״̬£ºHTTP ÐÒéÊÇÎÞ״̬ÐÒé¡£ÎÞ״̬ÊÇÖ¸ÐÒé¶ÔÓÚÊÂÎñ´¦ÀíûÓмÇÒäÄÜÁ¦¡£È±ÉÙ״̬Òâζ×ÅÈç¹ûºóÐø´¦ÀíÐè񻂡̾µÄÐÅÏ¢£¬ÔòËü±ØÐëÖØ´«£¬ÕâÑù¿ÉÄܵ¼ÖÂÿ´ÎÁ¬½Ó´«Ë͵ÄÊý¾ÝÁ¿Ôö´ó¡£ÁíÒ»·½Ã棬ÔÚ·þÎñÆ÷²»ÐèÒªÏÈǰÐÅϢʱËüµÄÓ¦´ð¾Í½Ï¿ì¡£
4.2.3 HTTPµÄURL¸ñʽ·ÖÎö
URLÊÇÒ»ÖÖÌØÊâÀàÐ͵ÄURI£¬°üº¬ÁËÓÃÓÚ²éÕÒij¸ö×ÊÔ´µÄ×ã¹»µÄÐÅÏ¢µÄ¸ñʽÈçÏ£º
http://host[\
ÆäÖУºhttp±íʾҪͨ¹ýHTTPÐÒéÀ´¶¨Î»ÍøÂç×ÊÔ´£»host±íʾºÏ·¨µÄInternetÖ÷»úÓòÃû»òÕßIP µØÖ·£»port Ö¸¶¨Ò»¸ö¶Ë¿ÚºÅ£¬Èç¹ûΪ¿Õ£¬ÔòʹÓÃȱʡ¶Ë¿Ú80£»abs_path Ö¸¶¨ÇëÇó×ÊÔ´µÄURI£»Èç¹ûURLÖÐûÓиø³öabs_path£¬ÄÇôµ±Ëü×÷ΪÇëÇóURI ʱ£¬±ØÐëÒÔ¡°/¡±µÄÐÎʽ¸ø³ö£¬Í¨³£Õâ¸ö¹¤×÷ä¯ÀÀÆ÷×Ô¶¯°ïÎÒÃÇÍê³É¡£
4.2.4 HTTPͨÐÅÐÒéÉè¼Æ
HTTPÐÒ鿪·¢ÊÇÔÚsocketͨÐŵĻù´¡ÉÏ»ùÓÚTCPµÄÐÒ鿪·¢£¬Òò´Ë£¬±¾ÎĽ«HTTPÐÒ鿪·¢·ÖΪ£ºURL½âÎö¡¢socket´´½¨¡¢·¢Ëͱ¨Í·ÏûÏ¢¡¢»ñÈ¡ÏìÓ¦±¨Í·ÏûÏ¢ºÍ»ñȡʵÌåÕýÎĵÈÎ岿·Ö¡£
1.URL½âÎö
ΪÁ˵õ½ÊäÈëURLµØÖ·ÖеÄÖ÷»úÃû¡¢¶Ë¿ÚºÅÒÔ¼°×ÊԴ·¾¶µÈÏà¹ØÐÅÏ¢£¬ÎÒÃÇÐèÒª¶ÔÆä½øÐнâÎö¡£±¾Îĸù¾Ýʵ¼ÊÇé¿öÉè¼ÆÁËÒ»¸ö½âÎöURLµØÖ·µÄº¯ÊýÈçÏÂËù
30
»ùÓÚGStreamerµÄSmooth Streaming²å¼þ¿ª·¢
ʾ£º
int parse_url(char *url, char *server, int *port, char *path) ÆäÖУº´«Èë²ÎÊýurlΪÊäÈëµÄµØÖ·£»´«³ö²ÎÊýserverΪÖ÷»úÃû¡¢portΪ¶Ë¿ÚºÅ¡¢pathΪ×ÊÔ´Ïà¹ØÂ·¾¶¡£
2.socket´´½¨
ÒÀ¾ÝµÚÒ»ÕÂÖеĿͻ§¶Ësocket´´½¨¹ý³Ì´´½¨HTTPÐÒéµÄsocket¡£±¾ÎÄÉè¼Æ¸Ãsocket´´½¨º¯ÊýÈçÏÂËùʾ£º
int http_Socketcreate(char *hostaddr, int portnum)
ÆäÖУº´«Èë²ÎÊýhostaddrΪIPµØÖ·£»´«Èë²ÎÊýportnumΪ¶Ë¿ÚºÅ£»·µ»ØÖµÎª´´½¨³É¹¦µÄsocket id¡£
3.·¢Ëͱ¨Í·ÏûÏ¢
µ±¿Í»§¶ËÓë·þÎñÆ÷½¨Á¢ºÃÁ¬½Óºó£¬´Ëʱ¿Í»§¶ËÓ¦¸Ã·¢ËÍÇëÇóÏûÏ¢¸ø·þÎñÆ÷¡£±¾ÎÄÉè¼ÆÁËÒ»¸ö·¢ËÍÏûÏ¢µÄº¯ÊýÈçÏÂËùʾ£º
int http_Send(int sockfd, char *request)
ÆäÖУº´«Èë²ÎÊýsockfdΪ´´½¨µÄ¿Í»§¶Ësocket id£»requestΪ´«ÈëµÄÇëÇóÏûÏ¢¡£±¾ÎÄֻɿ¼°µ½HTTPÖеÄGET·½·¨£¬Òò´ËÇëÇóÏûÏ¢¸ñʽÈçÏÂËùʾ£º
sprintf(request, \ Host: %s:%d\\r\\n
Connection: Keep-Alive\\r\\n\\r\\n\ host_file, host_addr, portnum);
ÆäÖУºhost_fileΪÇëÇó×ÊԴĿ¼£»host_addrΪÖ÷»úIPµØÖ·£»portnumΪͨÐŶ˿ںš£Ìí¼Ó´òÓ¡ÐÅÏ¢¿ÉÒÔ¿´µ½·¢Ë͵ÄÇëÇó±¨Í·ÄÚÈÝÈçͼ4-4Ëùʾ£º
ͼ4-4 ·¢Ëͱ¨Í·ÏûÏ¢
4.»ñÈ¡ÏìÓ¦±¨Í·ÏûÏ¢
µ±·þÎñÆ÷ÊÕµ½¿Í»§¶ËµÄÇëÇóÏûÏ¢ºó£¬½«»á·¢ËÍÏà¹ØµÄÏìÓ¦±¨Í·ÐÅÏ¢ºÍʵÌåÕýÎĸø¿Í»§¶Ë£¬Èÿͻ§¶Ë»ñµÃʵÌåÕýÎĵÄһЩÏà¹ØÊý¾Ý¡£±¾ÎÄÉè¼ÆÁËÒ»¸ö»ñÈ¡ÏìÓ¦±¨Í·ÏûÏ¢µÄº¯ÊýÈçÏÂËùʾ£º
31
°Ù¶ÈËÑË÷¡°77cn¡±»ò¡°Ãâ·Ñ·¶ÎÄÍø¡±¼´¿ÉÕÒµ½±¾Õ¾Ãâ·ÑÔĶÁÈ«²¿·¶ÎÄ¡£Êղر¾Õ¾·½±ãÏ´ÎÔĶÁ£¬Ãâ·Ñ·¶ÎÄÍø£¬Ìṩ¾µäС˵×ÛºÏÎÄ¿â»ùÓÚGstreamer¿ò¼ÜµÄsmooth streamingÐÒéµÄ²å¼þ¿ª·¢ - ͼÎÄ(6)ÔÚÏßÈ«ÎÄÔĶÁ¡£
Ïà¹ØÍÆ¼ö£º
