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");
[解决办法]
飘过,看看