文章来源: http://blog.csdn.net/leixiaohua1020/article/details/15811977
做这个例子的时候,发现以下问题:
1. 我尝试HEVC 视频码流 复用 MP3音频码流,输出为MPEGTS格式,结果只有视频。
原因如下:
视频码流没有时间戳, 而音频有。 导致av_compare_ts 总是判断该读视频并写到输出。(因为视频PTS总是0, 而音频>0, 函数判断视频进度落后该写入)
解决办法:
从楼主其他例子抄过来一段代码可以解决问题, 这段代码判断如果视频没有PTS,则根据帧率信息重新生成PTS。
代码:
<span style="font-family: Arial, Helvetica, sans-serif;">//Simple Write PTS</span>
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.