티스토리 뷰

기타

[FFmpeg] yuv420 to JPEG

developer0hye 2022. 6. 26. 12:29

AVFrame의 컬러포맷이 YUV420이면 Context의 strict_std_compliance를 FF_COMPLIANCE_EXPERIMENTAL 로 지정해주어야한다. 아니면 워닝 떴던가 에러 떴던듯.

 

    const AVCodec *jpegCodec = avcodec_find_encoder(AV_CODEC_ID_MJPEG);
    if (!jpegCodec) {
        return -1;
    }
    AVCodecContext *jpegContext = avcodec_alloc_context3(jpegCodec);
    if (!jpegContext) {
        return -1;
    }

    jpegContext->pix_fmt = (AVPixelFormat)pFrame->format;
    jpegContext->height = pFrame->height;
    jpegContext->width = pFrame->width;
    jpegContext->time_base.num = 1;
    jpegContext->time_base.den = 1; 
    jpegContext->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;

    jpegContext->flags |= AV_CODEC_FLAG_QSCALE;
    jpegContext->qmin = qscale;

 

그리고 QP값 바꾸는거는 flags에 AV_CODEC_FLAG_QSCALE 값을 ON시켜주고 qmin 값을 1~31 값으로 지정해주면된다.

 

왜 global_quality가 아닌 qmin 값을 바꿔야하는지는 좀 의아하다. ffmpeg을 디버깅해서 qmin 값이 어디서 쓰이는지 확인해봐야할듯...

 

아래 프로젝트 만들며 쓴글임.

 

https://github.com/developer0hye/Practical-FFmpeg-Examples

 

GitHub - developer0hye/Practical-FFmpeg-Examples: Practical FFmpeg examples for beginners

Practical FFmpeg examples for beginners. Contribute to developer0hye/Practical-FFmpeg-Examples development by creating an account on GitHub.

github.com

 

2022-07-09 

 

FFmpeg 코드를 직접 디버깅 해보며 왜 AVCodecContext의 global_quality 가 아닌 qmin 값을 바꿔줬어야했는지 알게됐고 AVCodecContext의 qmin 값을 바꿔주는 것 보다는 AVFrame의 quality 값을 바꿔주는 게 맞다는 것을 알게됐다.

 

estimate_qp라는 함수내에서 최종적으로 압축에 쓰이는 qp값이 정해진다.

 

그리고 이 qp값은 s->lambda 값에 의해 update_qscale 함수내에서 최종적으로 정의된다.

그런데 s->lambda 값이 s->current_picture.f->quality 값에 의해 결정되는 걸 볼 수 있다. Context가 아닌 frame에 저장된 quality값에 의해 최종적으로 qp값이 정해진다는 의미이다. 

 

이걸로 StackOverflow에 답변도 남겼다.

 

https://stackoverflow.com/a/72611782/10386667

 

How to set ffmpeg qscale in C/C++ for image encoding

I have a working image encoder in C++ using ffmpeg as the backend. I am taking videos in and saving frames out as jpeg, but I am having difficulty adjusting the quality of the output jpegs. Things I

stackoverflow.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함