Frage

Ich habe ein Projekt mit libavcodec (ffmpeg). Ich verwende es MPEG-2-Video bei 4 zu kodieren: 2: 2 Profil, Main Level. Ich habe das Pixelformat PIX_FMT_YUV422P im AVCodecContext ausgewählt, aber die Videoausgabe Ich erhalte hat alle Farben falsch, und scheint mir, wie der Geber falsch die Puffer zu lesen ist, als ob sie es denkt, ist 4: 2: 0 Chroma eher als 4: 2: 2. Hier ist mein Codec-Setup:

// 
// AVFormatContext* _avFormatContext previously defined as mpeg2video
//

//
// Set up the video stream for output
//
AVVideoStream* _avVideoStream = av_new_stream(_avFormatContext, 0);
if (!_avVideoStream)
{
    err = ccErrWFFFmpegUnableToAllocateStream;
    goto bail;
}
_avCodecContext = _avVideoStream->codec;
_avCodecContext->codec_id = CODEC_ID_MPEG2VIDEO;
_avCodecContext->codec_type = CODEC_TYPE_VIDEO;

//
// Set up required parameters
//
_avCodecContext->rc_max_rate = _avCodecContext->rc_min_rate = _avCodecContext->bit_rate = src->_avCodecContext->bit_rate;
_avCodecContext->flags = CODEC_FLAG_INTERLACED_DCT;
_avCodecContext->flags2 = CODEC_FLAG2_INTRA_VLC | CODEC_FLAG2_NON_LINEAR_QUANT;
_avCodecContext->qmin = 1;
_avCodecContext->qmax = 1;
_avCodecContext->rc_buffer_size = _avCodecContext->rc_initial_buffer_occupancy = 2000000;
_avCodecContext->rc_buffer_aggressivity = 0.25;
_avCodecContext->profile = 0;
_avCodecContext->level = 5;
_avCodecContext->width = f->GetWidth(); // f is a private Frame class with width, height properties etc.
_avCodecContext->height = f->GetHeight();
_avCodecContext->time_base.den = 25;
_avCodecContext->time_base.num = 1;
_avCodecContext->gop_size = 12;
_avCodecContext->max_b_frames = 2;
_avCodecContext->pix_fmt = PIX_FMT_YUV422P;

if (_avFormatContext->oformat->flags & AVFMT_GLOBALHEADER)
{
    _avCodecContext->flags |= CODEC_FLAG_GLOBAL_HEADER;
}

if (av_set_parameters(_avFormatContext, NULL) < 0)
{
    err = ccErrWFFFmpegUnableToSetParameters;
    goto bail;
}

//
// Set up video codec for encoding
//
AVCodec* _avCodec = avcodec_find_encoder(_avCodecContext->codec_id);
if (!_avCodec)
{
    err = ccErrWFFFmpegUnableToFindCodecForOutput;
    goto bail;
}
if (avcodec_open(_avCodecContext, _avCodec) < 0)
{
    err = ccErrWFFFmpegUnableToOpenCodecForOutput;
    goto bail;
}

Ein Screengrab des resultierenden Videorahmen kann unter http sehen: //ftp.limeboy. com / images / screen_grab.png (der Eingang war Standardfarbbalken).

Ich habe durch die Ausgabe Debug Frames zu TGA-Format an verschiedenen Punkten im Prozess überprüft, und ich kann bestätigen, dass es alles in Ordnung ist und gut, bis der Punkt, dass libavcodec Codiert der Rahmen.

Jede mögliche Unterstützung geschätzt!

Cheers, Mike.

War es hilfreich?

Lösung

OK, das ist peinlich.

so, wie ich hatte Eigentlich ist es eingerichtet ist richtig. Beim Blick durch den Quellcode für ffmpeg, scheint es, dass alles, was Sie tun müssen, um es zu bekommen zu kodieren 4: 2: 2 Profil und 4: 2: 2 Chroma ist das ankommende Pixelformat PIX_FMT_YUV422P zu setzen

.

Die Ursache des Problems? Ich beobachte die Videodatei zurück auf VLC in einer virtuellen Maschine, die ihr Video zu einem bestimmten Zeitpunkt Auflösung von 32-Bit auf 16-Bit verändert hatte.

Das ist richtig! IT verändert es. Ich habe es nicht ändern - IT haben es geschafft! ALLEIN du mich hören !!

Entschuldigt, wenn jemand ihre Zeit der Jagd nach dieser nicht-Ausgabe verschwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top