Die avcodec-Bibliothek extrahiert nicht alle Frames aus einem Video
Ich habe eine Bibliothek geschrieben, die mit Python verwendet werden könnte, um Frames aus einem Video in einem Puffer für die Verarbeitung zu extrahieren. Ich habe die Beispiele aus dem ffmpeg verwendet, um meine Bibliothek mit libavcodec zu erstellen. Dies und scheint bei den meisten Videos gut zu funktionieren. Aber ich sehe auf einigen Videos, wo meine Bibliothek nicht alle Frames extrahiert (weit weniger als das FPS).
Es scheint, als wären die Pakete möglicherweise nicht in Ordnung und Docoder kann damit nicht umgehen. Ich bekomme viele der folgenden Fehler
pid = 100 pes_code = 0x1e0
nal_unit_type: 9, nal_ref_idc: 0
nal_unit_type: 1, nal_ref_idc: 2
deblocking_filter_idc 7 außerhalb des gültigen Bereichs
Fehler decode_slice_header
kein Rahmen!
Ich verwende die folgenden Schritte, um den Decoder einzurichten.
//open input file, allocate context if ((ret = avformat_open_input(&format_ctx, in_filename, 0, 0)) < 0) { PyErr_SetString(ExtractorError, "Could not open input file!"); goto end; } if ((ret = avformat_find_stream_info(format_ctx, 0)) < 0) { PyErr_SetString(ExtractorError, "Failed to retrieve input stream information!"); goto end; } av_dump_format(format_ctx, 0, in_filename, 0); // Get the video index from the stream for(int i=0; i<format_ctx->nb_streams ;i++ ) { if( format_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ) { video_stream_index = i; break; } } /* if video stream not availabe */ if((video_stream_index) == -1) { PyErr_SetString(ExtractorError, "video stream to retreive fps is not found!"); return NULL; } long duration = format_ctx->duration + (format_ctx->duration <= INT64_MAX - 5000 ? 5000 : 0); float duration_in_secs = (float)duration / AV_TIME_BASE; stream_mapping_size = format_ctx->nb_streams; stream_mapping = av_mallocz_array(stream_mapping_size, sizeof(*stream_mapping)); if (!stream_mapping) { ret = AVERROR(ENOMEM); goto end; } AVCodec *pCodec = NULL; AVCodecParameters *in_codecpar = NULL; for (i = 0; i < format_ctx->nb_streams; i++) { AVStream *in_stream = format_ctx->streams[i]; in_codecpar = in_stream->codecpar; if (in_codecpar->codec_type != AVMEDIA_TYPE_AUDIO && in_codecpar->codec_type != AVMEDIA_TYPE_VIDEO && in_codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) { stream_mapping[i] = -1; continue; } if (in_codecpar->codec_type == AVMEDIA_TYPE_VIDEO){ pCodec = avcodec_find_decoder(in_codecpar->codec_id); stream_mapping[i] = stream_index++; break; } } if(!pCodec){ PyErr_SetString(ExtractorError, "error, no pCodec!"); return NULL; } // convert CodecParam to CodecCtx AVCodecContext *pCodecCtx = avcodec_alloc_context3(pCodec); if (!pCodecCtx) { PyErr_SetString(ExtractorError, "Failed to convert codecParam to CodecCtx!"); return NULL; } ret = avcodec_parameters_to_context(pCodecCtx, in_codecpar); if (ret < 0) goto end; //open video decoder if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) { logging("EXTRACTOR: failed to open codec through avcodec_open2\n"); return NULL; }
Um es zu testen, habe ich den folgenden Befehl von ffmpeg verwendet, um Frames aus demselben Video zu extrahieren, und es hat gut funktioniert.
ffmpeg -i ~ / thuuz / extractor / 03000.ts -f image2 -qscale: v 7 ffmpeg-detect -% 03d.jpg -hide_banner -v leise
Bin ich nicht die richtigen Codec-Params? Bitte lassen Sie mich einige Eingaben zum Debuggen dieses Problems wissen. Danke vielmals.
0 Antworten auf die Frage
Verwandte Probleme
-
9
Was ist der Unterschied zwischen den Befehlen "su -s" und "sudo -s"?
-
4
Gutes freies Ubuntu Server-VMWare-Image benötigt
-
4
Was sind die Unterschiede zwischen den großen Linux-Distributionen? Werde ich es merken
-
2
Begrenzung der CPU-Auslastung für Flash in Firefox?
-
2
Wie kann ich mein Mikrofon unter Debian GNOME zum Laufen bringen?
-
2
Conky-Setups - Beispiele / Ideen?
-
3
Was sind die Unterschiede zwischen Linux Window Managern?
-
2
ThunderBird / Lichtsynchronisation mit SE k770i
-
4
Linux-Dateisystem
-
6
Vollbild-Flash langsam in KDE 4