音视频码流复用问题

文章来源:  http://blog.csdn.net/leixiaohua1020/article/details/15811977


做这个例子的时候,发现以下问题:


1. 我尝试HEVC 视频码流 复用 MP3音频码流,输出为MPEGTS格式,结果只有视频。
原因如下:
   视频码流没有时间戳, 而音频有。 导致av_compare_ts 总是判断该读视频并写到输出。(因为视频PTS总是0, 而音频>0, 函数判断视频进度落后该写入)
  
解决办法:
  从楼主其他例子抄过来一段代码可以解决问题, 这段代码判断如果视频没有PTS,则根据帧率信息重新生成PTS。


代码:

//Simple Write PTS
if(pkt.pts==AV_NOPTS_VALUE)
{
	//Write PTS
	frame_index++;
	AVRational time_base1=in_stream->time_base;
	//Duration between 2 frames (us)
	int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(in_stream->r_frame_rate);
	//Parameters
	pkt.pts=(double)(frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);
	pkt.dts=pkt.pts;
	pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);

	cur_pts_v=pkt.pts;	
}

/* copy packet */
//转换PTS/DTS(Convert PTS/DTS)
pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
pkt.pos = -1;
pkt.stream_index=stream_index;



2. 其他的问题:

  重新生成PTS需要用到流的帧率。 对于视频来说  in_stream->r_frame_rate 就是帧率  而对音频来说则不是,它是音频采样比特率的10倍,原因不明。

  比如音频采样率是44.1KHz, 则MP3格式对应的帧率是 44100 * 2(channel) * 16(bit) * 10 = 14112000.


你可能感兴趣的:(FFMPEG,ffmpeg,复用)