首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

ffmpeg的视频音频编码同步有关问题,大家来帮帮忙吧

2012-03-29 
ffmpeg的视频音频编码同步问题,大家来帮帮忙吧大家帮我看看这个同步视频音频的程序把,视频的时间戳制作的

ffmpeg的视频音频编码同步问题,大家来帮帮忙吧
大家帮我看看这个同步视频音频的程序把,视频的时间戳制作的好像有问题,但又不知道问题出在哪
我要将一个音频为ac3的影音文件转换成音频为mp2的影音文件,它的视频格式不用变,因为有时候是双音轨的所以也要转换成双音轨的
下面是我的程序:[code=C/C++][/code]

  //////////////////////// 输入 ////////////////////////
  avcodec_register_all(); 
  avdevice_register_all();
  av_register_all();
 // printf("OK2\n");
  //////////////////////// 初始化 /////////////////////////
  AVFormatContext *infmt_ctx=NULL;//定义用来接收输入文件的AVFormatContext结构体的指针
  infmt_ctx=avformat_alloc_context();//为AVFormatContext结构体的指针分配内存
  //打开输入文件
  if(av_open_input_file(&infmt_ctx,input_file,NULL,0,NULL)!=0)
  {
printf("Can't open input file\n");  
return -2;  
  }
  //取出流信息
  if(av_find_stream_info(infmt_ctx)<0)  
  {  
printf("Can't find suitable codec parameters\n");  
return -3;  
  }  
  dump_format(infmt_ctx, 0, input_file, 0); //列出输入文件的相关流信息
 // printf("OK3\n");
  // 查找音频流信息
  int audioindex=-1;  
  int s_audioindex=-1;
  int j;  
  for(j=0;j<infmt_ctx->nb_streams;j++)  
  {  
if(infmt_ctx->streams[j]->codec->codec_type == CODEC_TYPE_AUDIO)//查找第一个音频流  
{  
audioindex=j;
printf("audio1:%d\n",audioindex);
break;  
}  
  }
  if(audioindex==-1) //没有找到音频流  
  {  
printf("Can't find audio stream\n");  
return -4;  
  }  


  if(infmt_ctx->streams[audioindex]->codec->codec_id!=CODEC_ID_AC3)//如果该音频不是AC3格式,就不进行处理
  {
printf("The audio is not AC3,we don't need to handle it");
av_close_input_file(infmt_ctx);//释放AVFormatContext的指针
return 0;  
  }
  AVCodecContext *inAcode_ctx=NULL;//定义音频解码上下文的指针  
  AVCodec *inAcodec=NULL;//定义音频解码器的指针  
  AVCodecContext *s_inAcode_ctx=NULL;//定义音频解码上下文的指针  
  AVCodec *s_inAcodec=NULL;//定义音频解码器的指针  
  inAcode_ctx=infmt_ctx->streams[audioindex]->codec;//得到音频流解码上下文的指针  
  //找到合适的音频解码器  
  inAcodec=avcodec_find_decoder(inAcode_ctx->codec_id);  
  if(inAcodec==NULL)//如果没找到合适的音频解码器  
  {  
printf("Can't find suitable audio decoder\n");  
return -5;  
  }
  //打开该音频解码器  
  if(avcodec_open(inAcode_ctx, inAcodec)<0)//如果成功,返回值>=0,失败,则返回值<0  
  {  
printf("Can't open the audio decoder\n");  
return -6;  
  }

 // printf("OK4\n");
  //视频流信息 
  int videoindex=-1;  
  for(j=0;j<infmt_ctx->nb_streams;j++)//查找第一个视频流  
  {  
if(infmt_ctx->streams[j]->codec->codec_type==CODEC_TYPE_VIDEO)  
{  
videoindex=j;  
break;  
}  
  }
  if(videoindex==-1) //没有找到视频流  
  {  
printf("Can't find video stream\n");  
return -7;  
  }  
  AVCodecContext *inVcode_ctx=NULL;//定义视频解码上下文的指针  
  AVCodec *inVcodec=NULL;//定义视频解码器的指针  
  inVcode_ctx=infmt_ctx->streams[videoindex]->codec;//得到视频流解码上下文的指针  
  //找到合适的视频解码器  


  inVcodec=avcodec_find_decoder(inVcode_ctx->codec_id);  
  if(inVcodec==NULL)//如果没找到合适的视频解码器 
  {  
printf("Can't find suitable video decoder\n");  
return -8;  
  }
  //打开该视频解码器 
  if(avcodec_open(inVcode_ctx, inVcodec)<0)//如果成功,返回值>=0,失败,则返回值<0  
  {  
printf("Can't open the video decoder\n");  
return -9;  
  }
 // printf("OK5\n");
  大家帮我看看这个同步视频音频的程序把,视频的时间戳制作的好像有问题,但又不知道问题出在哪
我要将一个音频为ac3的影音文件转换成音频为mp2的影音文件,它的视频格式不用变,因为有时候是双音轨的所以也要转换成双音轨的
下面是我的程序:[code=C/C++][/code]

  //////////////////////// 输入 ////////////////////////
  avcodec_register_all(); 
  avdevice_register_all();
  av_register_all();
 // printf("OK2\n");
  //////////////////////// 初始化 /////////////////////////
  AVFormatContext *infmt_ctx=NULL;//定义用来接收输入文件的AVFormatContext结构体的指针
  infmt_ctx=avformat_alloc_context();//为AVFormatContext结构体的指针分配内存
  //打开输入文件
  if(av_open_input_file(&infmt_ctx,input_file,NULL,0,NULL)!=0)
  {
printf("Can't open input file\n");  
return -2;  
  }
  //取出流信息
  if(av_find_stream_info(infmt_ctx)<0)  
  {  
printf("Can't find suitable codec parameters\n");  
return -3;  
  }  
  dump_format(infmt_ctx, 0, input_file, 0); //列出输入文件的相关流信息
 // printf("OK3\n");
  // 查找音频流信息
  int audioindex=-1;  
  int s_audioindex=-1;
  int j;  
  for(j=0;j<infmt_ctx->nb_streams;j++)  
  {  
if(infmt_ctx->streams[j]->codec->codec_type == CODEC_TYPE_AUDIO)//查找第一个音频流  
{  
audioindex=j;
printf("audio1:%d\n",audioindex);
break;  
}  
  }
  if(audioindex==-1) //没有找到音频流  
  {  
printf("Can't find audio stream\n");  
return -4;  
  }  


  if(infmt_ctx->streams[audioindex]->codec->codec_id!=CODEC_ID_AC3)//如果该音频不是AC3格式,就不进行处理
  {
printf("The audio is not AC3,we don't need to handle it");
av_close_input_file(infmt_ctx);//释放AVFormatContext的指针
return 0;  
  }
  AVCodecContext *inAcode_ctx=NULL;//定义音频解码上下文的指针  
  AVCodec *inAcodec=NULL;//定义音频解码器的指针  
  AVCodecContext *s_inAcode_ctx=NULL;//定义音频解码上下文的指针  
  AVCodec *s_inAcodec=NULL;//定义音频解码器的指针  
  inAcode_ctx=infmt_ctx->streams[audioindex]->codec;//得到音频流解码上下文的指针  
  //找到合适的音频解码器  
  inAcodec=avcodec_find_decoder(inAcode_ctx->codec_id);  
  if(inAcodec==NULL)//如果没找到合适的音频解码器  
  {  
printf("Can't find suitable audio decoder\n");  
return -5;  
  }
  //打开该音频解码器  
  if(avcodec_open(inAcode_ctx, inAcodec)<0)//如果成功,返回值>=0,失败,则返回值<0  
  {  
printf("Can't open the audio decoder\n");  
return -6;  
  }

 // printf("OK4\n");
  //视频流信息 
  int videoindex=-1;  
  for(j=0;j<infmt_ctx->nb_streams;j++)//查找第一个视频流  
  {  
if(infmt_ctx->streams[j]->codec->codec_type==CODEC_TYPE_VIDEO)  


{  
videoindex=j;  
break;  
}  
  }
  if(videoindex==-1) //没有找到视频流  
  {  
printf("Can't find video stream\n");  
return -7;  
  }  
  AVCodecContext *inVcode_ctx=NULL;//定义视频解码上下文的指针  
  AVCodec *inVcodec=NULL;//定义视频解码器的指针  
  inVcode_ctx=infmt_ctx->streams[videoindex]->codec;//得到视频流解码上下文的指针  
  //找到合适的视频解码器  
  inVcodec=avcodec_find_decoder(inVcode_ctx->codec_id);  
  if(inVcodec==NULL)//如果没找到合适的视频解码器 
  {  
printf("Can't find suitable video decoder\n");  
return -8;  
  }
  //打开该视频解码器 
  if(avcodec_open(inVcode_ctx, inVcodec)<0)//如果成功,返回值>=0,失败,则返回值<0  
  {  
printf("Can't open the video decoder\n");  
return -9;  
  }
 // printf("OK5\n");
 

[解决办法]
飘过,看看

热点排行