視頻幀數據用硬件編碼輸出,僅僅使用FFMPEG將硬件編碼出的數據推流RTSP數據後嚴重花屏且畫面卡住不動

由於使用的是其他硬件編碼器出來的數據,所以不再是使用av_read_frame來獲取AVPacket包了,所以在輸出編碼數據的回調接口裏寫僞代碼如下:

//相當於初始化AVPacket包			
AVPacket* tmp = (AVPacket*)malloc(sizeof(AVPacket));
av_init_packet(tmp);

tmp->data = (uint8_t*)malloc(packet.size());
memmove(tmp->data, packet.data(), packet.size());
tmp->size = packet.size();

av_interleaved_write_frame(outfmt_ctx, tmp);

這樣寫入畫面花屏並且卡着不動。

1.解決爲什麼卡着不動

通過查看outfmt_ctx->streams[0]->time_base(這裏的0其實就是視頻流),可以看到是9000爲單位的,所以在上面的僞代碼中添加pts如下:
AVPacket* tmp = (AVPacket*)malloc(sizeof(AVPacket));
av_init_packet(tmp);

tmp->data = (uint8_t*)malloc(packet.size());
memmove(tmp->data, packet.data(), packet.size());
tmp->size = packet.size();

tmp->pts = pts;//主要是這個pts自增9000,爲什麼是9000呢,通過outfmt_ctx->streams[0]->time_base來知道

tmp->dts = pts;

av_interleaved_write_frame(outfmt_ctx, tmp);

pts += 9000;//自增9000是關鍵,這樣視頻纔不會卡着不動

2.畫面花屏問題,是因爲編碼出的數據在第一個i幀上會有sps,pps,後面的I幀都不會有,所以後續在每個i幀加入pps和pps就沒有花屏了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章