长风破浪会有时,直挂云帆济沧海

Dream Word

博客园 首页 新随笔 联系 订阅 管理

记录做NVENC视音频同步遇到的问题:
1:思路;使用ffmpeg进行拆包,分离音视频,然后音频就行解码后使用SDL播放,视屏使用cuda进行解码,


首先,完成所有初始化工作
创建解码器cuvidCreateDecoder(&oDecoder_, &oVideoDecodeCreateInfo_);
创建解析器cuvidCreateVideoParser(&hParser_, &oVideoParserParameters);
然后进行数据包的解析cuvidParseVideoData(pVideoSourceData->hVideoParser, pPacket);

注意:进行数据包的解析的时候,需要对ffmpeg解析出来的包进行特殊处理,不然NVENC的回调接口不能正常回调
(参考
AVBitStreamFilterContext* bsfc = av_bitstream_filter_init("h264_mp4toannexb");

av_bitstream_filter_filter(bsfc, pVideo->pVideoCodecCtx, NULL, &pVideo->pPacket->data, &pVideo->pPacket->size, pVideo->pPacket->data, pVideo->pPacket->size, 0);
  CUVIDSOURCEDATAPACKET pkt;
  pkt.flags = CUVID_PKT_TIMESTAMP;
  pkt.payload_size = pVideo->pPacket->size;
  pkt.payload = pVideo->pPacket->data;
  pkt.timestamp = pVideo->pPacket->pts;

  .....................

  cuvidParseVideoData(pVideoSourceData->hVideoParser, pPacket);

  .....................

  

遇到的问题:

  ffmpeg解码后的Packet中是纯净的H264,其中却少ADTS头信息,然后解码器解码时需要该信息,所以需要使用 AVBitStreamFilterContext* bsfc = av_bitstream_filter_init("h264_mp4toannexb");对每个packet文件进行调整,如果解码HEVC编码格式的视屏,需要使用hevc_mp4toannexb,但是需要ffmpeg的版本支持cuda解码。

posted on 2017-06-16 22:46  长风II  阅读(1239)  评论(0编辑  收藏  举报