我的libH264应用程序正在对传入的相机数据执行编码,但它会不断累积数据并减慢其执行的更多编码操作的速度。知道为什么会这样吗?
变量在程序开始时分配。我的顺序不正确吗?我怀疑我必须重新初始化某些结构,但是我找不到解决方法...
这是我在相机线程中的代码的一部分:
int nWidth = 640;
int nHeight = 480;
填写YUV数据
memcpy(p264Pic->img.plane[0],pic.buffer,nWidth*nHeight);
memcpy(p264Pic->img.plane[1],pic.buffer+nWidth*nHeight,nWidth*nHeight/4);
memcpy(p264Pic->img.plane[2],pic.buffer+nWidth*nHeight*5/4,nWidth*nHeight/4);
填写PTS
p264Pic->i_pts = high_resolution_timer_tick_count();
// if( nFramsInPack % 8 == 0){
// p264Pic->i_type = X264_TYPE_I;
// }else{
p264Pic->i_type = X264_TYPE_AUTO;
// }
if( x264_encoder_encode( p264Handle, &p264Nal, &i264Nal, p264Pic ,&pic_out) < 0 ) {
fprintf( stderr, "x264_encoder_encode failed/n" );
}
printf("i264Nal %d\n", i264Nal );
for( int i = 0; i < i264Nal; i++ )
{
printf( "nal pass %d\n", i );
int i_data = 1024*32;
printf( "nal encode\n" );
x264_nal_encode( p264Handle, pNal, &p264Nal[i] );
printf( "after nal encode\n" );
int i_size = p264Nal[i].i_payload;
printf("i_size %d\n", i_size );
if( i_size > 0 ) {
if ((pNal[4]&0x60)==0) {
continue;
}
if (pNal[4]==0x67) {
continue;
}
if (pNal[4]==0x68) {
continue;
}
memmove(pNal,pNal+4,i_size-4);
pNal+=i_size-4;
}
else if( i_size < 0 ) {
fprintf( stderr,"need to increase buffer size (size=%d)/n", -i_size );
}
}
将数据打包到RTMP
unsigned int nSize=pNal-szNalBuffer;
packet.m_nBodySize=nSize+9;
if (i264Nal>1) {
szBodyBuffer[ 0]=0x17;
}
else {
szBodyBuffer[ 0]=0x27;
}
put_be32((char *)szBodyBuffer+5,nSize);
memcpy(szBodyBuffer+9,szNalBuffer,pNal-szNalBuffer);
printf( "rtmp send packet\n" );
RTMP_SendPacket(rtmp,&packet,0);
newTick=high_resolution_timer_tick_count();
packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM;
packet.m_nTimeStamp+=newTick-oldTick;
oldTick=newTick;
这是我的应用程序的输出:
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 0
rtmp send packet
i264Nal 4
nal pass 0
nal encode
after nal encode
i_size 36
nal pass 1
nal encode
after nal encode
i_size 15
nal pass 2
nal encode
after nal encode
i_size 632
nal pass 3
nal encode
after nal encode
i_size 7151
rtmp send packet
i264Nal 1
nal pass 0
nal encode
after nal encode
i_size 8136
rtmp send packet
i264Nal 1
nal pass 0
nal encode
after nal encode
i_size 28955
rtmp send packet
^CThe pthread schedule_do end
^Cthread is end
i264Nal 1
nal pass 0
nal encode
after nal encode
最佳答案
x264_encoder_encode(...)
返回帧大小,您似乎没有考虑到这一点。您使用的是i_payload,但取决于NAL类型,这将不是正确的值。x264_nal_encode
看起来已被删除,并且x264_encoder_encode
现在返回编码为最终单位的帧。返回int frame_size
。
关于c - libx264 x264_nal_encode溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23550188/