由於使用的是其他硬件編碼器出來的數據,所以不再是使用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就沒有花屏了