Insights pour encoder/décodage vidéo avec h264 ffmpeg (sans perte)C++ h264 ffmpeg/libav encode/decode (sans perte) émet
Je suis quelque chose de travail de la part de l'encodage, encodez un fichier AVI en 264 mais VLC jouer wont il, cependant Totem sera. Décoder le même fichier s'avère gênant. (Je veux exactement les mêmes données/cadre que de sortir), je les reçois;
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
et ultimatly ce
[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
GAME OVER. Maintenant, je soupçonne que je dois revenir à 1. la partie encodage, il y a une bonne raison pour laquelle VLC ne la jouera pas!
Je code comme ça.
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);
}
}
Et le codec est configuré comme ceci:
AVCodecID dasd = AV_CODEC_ID_H264;
codec = avcodec_find_encoder(dasd);
c = avcodec_alloc_context3(codec);
c->bit_rate = 400000;
c->width = 320;
c->height = 240;
c->time_base= (AVRational){1,25};
c->gop_size = 10;
c->max_b_frames=1;
c->pix_fmt = AV_PIX_FMT_YUV420P;
av_opt_set(c->priv_data, "preset", "slow", 0);
avcodec_open2(c, codec, NULL);
Depuis que je vais faire sans perte je ne traite pas avec des cadres retardés (? Est-ce une hypothèse correcte) Je ne peux pas réellement encoderez sans perte, il semble que je dois aller avec quelque chose comme
AVDictionary *param;
av_dict_set(¶m, "qp", "0", 0);
Et puis ouvrez ...
Je suppose que des questions me sont ces:
- Quels sont les codec params pour l'encodage sans perte (et des conseils si H264 est une très mauvaise idée à cet égard).
- Ai-je besoin de gérer des trames retardées lorsque je fais un test sans perte?
- Pourquoi VLC est-il en colère contre moi?
Merci.
Merci, je le ferai. Quand je rentre à la maison, je travaille sur un ordinateur portable que je viens de supposer est né avec une webcam intégrée .. j'avais tort. – MrSmith