免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2810 | 回复: 6
打印 上一主题 下一主题

Linux音视频同步问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-22 10:05 |只看该作者 |倒序浏览
本人开发了一个视频采集播放系统,程序基本写好了,单音视频不能同步,哪位大虾帮一下忙

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2009-08-22 10:10 |只看该作者

回复 #1 buaalinux1 的帖子

这个是你的程序问题,具体现象描述清楚一点

论坛徽章:
0
3 [报告]
发表于 2009-08-23 18:57 |只看该作者
终于有回应得了,先表示感谢,具体说来就是:声音和图像可以并发执行,但时间对不上号,此刻的声音不能和此刻的图像同步,具体程序如下,有会写同步的请帮忙给出答案,就是给点指点也好,大概该怎末做,说一下,不胜感激

//---------play avi---------------

/*image thread*/
void *thread3()
{
    int filesize;
    char *bbuffer=NULL;
    bbuffer = (char *)malloc (320*240*4);
    char *dataBuf;
    
    mem_file.pfilebuff=bbuffer;
    dataBuf=(char*)malloc(320*3*240);
    for(;;)
    {
         if(fread(&filesize,1,4,avfp) == 4)
        {
            printf("read filesize is : %d !\n",filesize);
        }      
        if(fread(bbuffer,1,filesize,avfp) != filesize)
        {
            printf("play is over !\n");
            break;
        }
        
        mem_file.base=0;
        mem_file.filesize=filesize;
        
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(mem_file.filesize<=0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!mem_file.pfilebuff)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cinfo.err=jpeg_std_error(&jerr.pub);
&nbsp;&nbsp;&nbsp;&nbsp;   jerr.pub.error_exit=my_error_exit;
&nbsp;&nbsp;&nbsp;&nbsp;   if (setjmp(jerr.setjmp_buffer))
&nbsp;&nbsp;&nbsp;&nbsp;        {
&nbsp;&nbsp;&nbsp;&nbsp;       jpeg_destroy_decompress(&cinfo);
&nbsp;&nbsp;&nbsp;&nbsp;       goto clearend;
&nbsp;&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;   jpeg_create_decompress(&cinfo);&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_stdio_src(&cinfo,(FILE *)(&mem_file));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_read_header(&cinfo,TRUE);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_start_decompress(&cinfo);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dataBuf==NULL)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("JpegFile :\nOut of memory");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_destroy_decompress(&cinfo);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto clearend;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row_stride=cinfo.output_width * cinfo.output_components;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width=cinfo.output_width;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height=cinfo.output_height;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer=(*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(cinfo.output_scanline<cinfo.output_height)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_read_scanlines(&cinfo,buffer,1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (cinfo.out_color_components==3)
&nbsp;&nbsp;&nbsp;&nbsp;      &nbsp;&nbsp;&nbsp;&nbsp;j_putRGBScanline(buffer[0],cinfo.output_width,dataBuf,cinfo.output_scanline-1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(cinfo.out_color_components==1)
&nbsp;&nbsp;&nbsp;&nbsp;      &nbsp;&nbsp;&nbsp;&nbsp;j_putGrayScanlineToRGB(buffer[0],cinfo.output_width,dataBuf,cinfo.output_scanline-1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void)jpeg_finish_decompress(&cinfo);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jpeg_destroy_decompress(&cinfo);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diff_width=fbdev.fb_width-width;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diff_height=fbdev.fb_height-height;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(diff_width>0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x= diff_width/2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width=fbdev.fb_width;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(diff_height>0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y=diff_height/2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   y=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   height=fbdev.fb_height;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fbdev.fb_draw(&fbdev,dataBuf,0,0,320,240);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;clearend:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(dataBuf);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(bbuffer);
}

/*sound thread*/
void *thread4()
{
&nbsp;&nbsp;&nbsp;&nbsp;int id;
&nbsp;&nbsp;&nbsp;&nbsp;int arg;
&nbsp;&nbsp;&nbsp;&nbsp;int status;
&nbsp;&nbsp;&nbsp;&nbsp;char buf[4096];

/*&nbsp;&nbsp;&nbsp;&nbsp;if((audiofd = open("/dev/sound/dsp",O_WRONLY)) < 0 )
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Can't open sound device!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&nbsp;&nbsp;&nbsp;&nbsp;}
*/

/*&nbsp;&nbsp;&nbsp;&nbsp;if((fd = open("/tmp/audio.wav",O_RDWR)) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Can't open output file!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit (1);
&nbsp;&nbsp;&nbsp;&nbsp;}
*/

&nbsp;&nbsp;&nbsp;&nbsp;arg = SIZE;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status = ioctl(audiofd,SOUND_PCM_WRITE_BITS,&arg);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(status == -1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("SOUND_PCM_WRITE_BITS ioctl failed\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(arg != SIZE)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("unable to set sample size\n");

&nbsp;&nbsp;&nbsp;&nbsp;arg = CHANNELS;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status = ioctl(audiofd,SOUND_PCM_WRITE_CHANNELS,&arg);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(status == -1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("SOUND_PCM_WRITE_CHANNELS ioctl failed\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(arg != CHANNELS)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("unable to set number of channels\n");

&nbsp;&nbsp;&nbsp;&nbsp;//arg = RATE;

&nbsp;&nbsp;&nbsp;&nbsp;arg =22050;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status = ioctl(audiofd,SOUND_PCM_WRITE_RATE,&arg);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(status == -1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("SOUND_PCM_WRITE_WRITE ioctl failed\n");

&nbsp;&nbsp;&nbsp;&nbsp;while(fread(buf,sizeof(buf),1,audiofp) > 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write(audiofd,buf,sizeof(buf));

}

void play_thread_create(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;int temp;
&nbsp;&nbsp;&nbsp;memset(&thread, 0, sizeof(thread));          //comment1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*创建线程*/
&nbsp;&nbsp;&nbsp;if((temp = pthread_create(&thread[0], NULL, thread3, NULL)) != 0)       //comment2

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(" sorry sir thread 3 failed !\n");
&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("my sir thread 3 is successful !\n");
&nbsp;&nbsp;&nbsp;&nbsp;if((temp = pthread_create(&thread[1], NULL, thread4, NULL)) != 0)  //comment3

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("sorry sir thread 4 failed !\n");
&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("my sir thread 4 is successful !\n");
}

void play_thread_wait(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*等待线程结束*/
&nbsp;&nbsp;&nbsp;&nbsp;if(thread[0] !=0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(thread[0],NULL);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("thread 1 was over! \n");
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;if(thread[1] !=0)
&nbsp;&nbsp;&nbsp;&nbsp;{              
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(thread[1],NULL);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("thread 2 was over !\n");
&nbsp;&nbsp;&nbsp;&nbsp;}
}


[ 本帖最后由 dreamice 于 2009-8-23 21:53 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2009-08-23 21:54 |只看该作者

回复 #3 buaalinux1 的帖子

应该是同步问题造成的,这个我也没什么经验

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
5 [报告]
发表于 2009-08-24 11:19 |只看该作者
加个timeline
然后声音的数据挂在timeline上,视频的也挂在timeline上
对比一下,就可以同步了,一般来说,是视频跟随声音的
图像处理速度慢的话,可以根据声音来跳帧

论坛徽章:
0
6 [报告]
发表于 2009-08-24 12:47 |只看该作者
一段段的放,同不同步只能靠天了.

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2009-08-24 15:05 |只看该作者
原帖由 T-bagwell 于 2009-8-24 11:19 发表
加个timeline
然后声音的数据挂在timeline上,视频的也挂在timeline上
对比一下,就可以同步了,一般来说,是视频跟随声音的
图像处理速度慢的话,可以根据声音来跳帧


Tbag兄,一般来说,音视频是同时存储在一起的,还是分开存储的?
我记得以前做的时候,是同时存储的,所以播放的时候不存在同步的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP