加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Linux中用socket实现视频、音频的同步传输

(2011-03-11 20:38:28)
标签:

杂谈

分类: Linux视频编程

在之前的一篇里已经提到过视频、声音的同步传输问题,当时想了几个方案,当然都是很不成熟的想法。有些事情只有做了才知道到底行不行得通,有时候实际情况比想象得要简单。

1、创建两个线程-视频线程、音频线程。
关于视频部分的实现参考,音频部分的实现参考。其中,视频实现单向传输,音频实现双向传输。两个线程之间并没有做任何类似于“信号量“的同步措施。因为只要保证视频和音频是”同时“发送,在接收端就可以”几乎“同时显示和播放。因为是在局域网中传输,速度有保证,在要求不是很苛刻的情况下,同步是可以满足的。而且,事实也证明了,这种很朴素的方法是行得通的。

pthread_create(&enc_tid,NULL,(void *)video_send, (void *)&arg);

//视频的详细介绍参看这里

pthread_create(&audio_tid,NULL,(void *)audio_encdec,(void *)&sockfd_audio);
//声音的详细介绍参看这里

2、既然要用两个线程来实现传输,一个很自然的问题就是:视频流和音频流是如何处理的?答案是:建立用两条独立的流,一条传输视频,一条传输声音。我们知道,socket在服务器端创建一个sockfd_server之后,这个sockfd_server可以一直监听是否有连接请求。也就是说,我们可以在服务器端创建一个server_fd,然后连接客户端的两个连接请求-视频、音频。
还是代码表示更直观:

发送端:(作为服务器端,和上次比做了调换)
//socket描述符
#define port 8000
int sockfd_server;
int sockfd_video;

int sockfd_audio;

//server_init函数也就是这里的recv_init,只是换了个名字。
sockfd_video=server_init(&sockfd_server,port);

//sockfd_server继续监听下一个请求。
sockfd_audio=accept(sockfd_server,(struct sockaddr *)NULL,NULL);

接收端:(作为客户端,同样做了调换)
#define port 8000
int err;
int sockfd_video;
int sockfd_audio;
const char *host_addr=”192.168.1.110″;

err=client_init(&sockfd_video,host_addr,port);

if(err==-1){
printf(”socket_video init failed!\n”);
return -1;
}


err=client_init(&sockfd_audio,host_addr,port);
if(err==-1){
printf(”socket_audio init failed!\n”);
return -1;
}

client_init函数同样是改了名字而已,也就是这里的send_init()。

3、建立了视频、音频流之后,就可以像操作文件一样来操作socket了。具体视频和音频的处理参考这里这里

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有