Wenn Sie die Dokumentation für av_frame_copy
lesen, heißt es "Diese Funktion weist nichts zu, dst muss bereits initialisiert und mit denselben Parametern wie src zugewiesen sein."
av_frame_alloc
tut nichts anderes als die AVFrame
Struktur zuweisen und initialisieren es einige Standardwerte. Am wichtigsten ist, dass es keine Puffer für die Rahmendaten zuweist oder den Rahmen für die Verwendung vorbereitet. av_frame_copy
schlägt fehl, da der Zielframe nicht das richtige Pixelformat festgelegt oder Puffer zugewiesen hat.
Wenn Sie einen Frame klonen möchten (indem Sie seinen Referenzzähler inkrementieren und keine tiefe Kopie erstellen), können Sie av_frame_clone
oder av_frame_ref
verwenden.
Wenn Sie den Rahmen verschieben möchten, können Sie av_frame_move_ref
verwenden.
Aber Sie möchten wahrscheinlich eine ordnungsgemäße tiefe Kopie machen. In diesem Fall können Sie den Quellcode der av_frame_make_writable
betrachten. Diese Funktion macht eine tiefe Kopie des Rahmens, wenn es nicht beschreibbar ist, so können wir die gleiche Logik verwenden, um eine tiefe Kopie des Rahmens zu machen hier:
AVFrame *copyFrame = av_frame_alloc();
copyFrame->format = frame->format;
copyFrame->width = frame->width;
copyFrame->height = frame->height;
copyFrame->channels = frame->channels;
copyFrame->channel_layout = frame->channel_layout;
copyFrame->nb_samples = frame->nb_samples;
av_frame_get_buffer(copyFrame, 32);
av_frame_copy(copyFrame, frame);
av_frame_copy_props(copyFrame, frame);
Hinweis, dass ich nicht auf Fehler überprüft in die Funktionen, die ich angerufen habe. Sie sollten das in Ihrem echten Code tun. Ich habe es hier der Kürze halber weggelassen.
Fehler -22 scheint zu bedeuten, dass eines Ihrer Argumente in ungültig, nach [diese Antwort] (https://stackoverflow.com/questions/26205017/ffmpeg-avcodec-open2-returns-22-ifi- change-my-loader-configuration/26205126 # 26205126) – user3386109