C++ C++;h264 ffmpeg/libav编码/解码(无损)问题

C++ C++;h264 ffmpeg/libav编码/解码(无损)问题,c++,ffmpeg,h.264,libav,C++,Ffmpeg,H.264,Libav,使用ffmpeg h264(无损)对视频进行编码/解码的细节 所以我在编码部分做了一些工作,在264中编码一个avi,但是VLC不会播放,而图腾会播放。 解码同一个文件很麻烦。(我希望输入和输出的数据/帧完全相同),我得到这些 saving frame 5 Video decoding [h264 @ 0x1d19880] decode_slice_header error frame :6 saving frame 6 Video decoding [h264 @ 0x1d19880]

使用ffmpeg h264(无损)对视频进行编码/解码的细节

所以我在编码部分做了一些工作,在264中编码一个avi,但是VLC不会播放,而图腾会播放。 解码同一个文件很麻烦。(我希望输入和输出的数据/帧完全相同),我得到这些

saving frame   5
Video decoding
[h264 @ 0x1d19880] decode_slice_header error
frame :6
saving frame   6
Video decoding
[h264 @ 0x1d19880] error while decoding MB 15 7, bytestream -27
[h264 @ 0x1d19880] concealing 194 DC, 194 AC, 194 MV errors in I frame
frame :7
saving frame   7
Video decoding
[h264 @ 0x1d19880] decode_slice_header error
这是最后通牒

[H264 Decoder @ 0x7f1320766040] frame :11
Broken frame packetizing
[h264 @ 0x1d19880] SPS changed in the middle of the frame
[h264 @ 0x1d19880] decode_slice_header error
[h264 @ 0x1d19880] no frame!
Error while decoding frame 11
比赛结束了

现在我怀疑我必须回到1。编码部分,可能有一个很好的理由VLC不会玩它

我这样编码

void encode(char *Y,char *U,char *V){
av_init_packet(&pkt);
pkt.data = NULL;    // packet data will be allocated by the encoder
pkt.size = 0;
fflush(stdout);

frame->data[0] = (uint8_t*)Y;
frame->data[1] = (uint8_t*)U;
frame->data[2] = (uint8_t*)V;
frame->pts = ++i;

ret = avcodec_encode_video2(c, &pkt, frame, &got_output);
if (ret < 0) {
    fprintf(stderr, "Error encoding frame\n");
    exit (EXIT_FAILURE);
}
if (got_output) {
    printf("Write frame %3d (size=%5d)\n", i, pkt.size);
    fwrite(pkt.data, 1, pkt.size, f);
    av_free_packet(&pkt);
}
}
因为我要进行无损检测,所以我没有处理延迟帧(这是一个正确的假设吗?) 我可能不是真的在进行无损编码,看起来我可能不得不这样做

AVDictionary *param;
av_dict_set(&param, "qp", "0", 0);
然后打开

所以我想我的问题是:

  • 无损编码的正确编解码器参数是什么(如果h264在这方面是个糟糕的主意,请给出建议)
  • 在进行无损检测时,是否需要处理延迟帧
  • 为什么VLC生我的气
谢谢

  • 实现无损:av_dict_set(¶m,“crf”,“0”,0)
  • 延迟帧(B帧)与无损无关。如果需要低延迟,则不要使用B帧

  • 您的编码中有严重错误。错误“I帧中的MV错误”在这里很奇怪,I帧中不应该有任何MV。看来解析它的头自己出错了。请共享位流和VLC故障的更多详细信息

    您正在将原始的annexb帧写入一个文件,而无需任何容器包装。使用mp4或matroska之类的容器,VLC会很高兴的。

    谢谢,我会的。当我回到家时,我正在一台笔记本电脑上工作,我以为它天生就内置了一个网络摄像头。。我错了。
    AVDictionary *param;
    av_dict_set(&param, "qp", "0", 0);