音视频码流复用问题

文章来源:  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.


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值