[Libav-user] Replacing deprecated AVStream codec parameter in libav
Gustav González
xtingray at gmail.com
Fri Mar 25 17:47:39 EET 2022
Thank you so much! It worked like a charm.
This is a basic resume to the implementation I made to replace the
deprecated stream->codec data structure
successfully:
1. Initialize AVFormatContext, AVOutputFormat variables (using
av_guess_format and avformat_alloc_output_context2)
2. Open video codec (using avcodec_find_encoder)
3. Add/Initialize AVStream variable (using avformat_new_stream)
4. Initialize AVCodecContext variable (using avcodec_alloc_context3)
5. Customize AVCodecContext parameters (if you need to. In example: width,
height, bit_rate, etc)
6. Add this piece of code:
if (formatContext->oformat->flags & AVFMT_GLOBALHEADER)
videoCodecContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
7. Open AVCodecContext variable (using avcodec_open2)
8. Copy AVCodecContext codecpar structure into AVStream codecpar (using
avcodec_parameters_from_context)
>From this point, you will be able to create and add frames to your output
file. Good luck!
On Wed, Mar 23, 2022 at 11:13 PM Yurii Monakov <monakov.y at gmail.com> wrote:
> Hi,
>
> You should initialize AVCodecContext, open it and then you can fill
> AVStream::codecpar with avcodec_parameters_from_context function. Please
> look at doc/examples/muxing.c for sample code.
>
> Yurii
>
> ср, 23 марта 2022 г. в 14:07, Gustav González <xtingray at gmail.com>:
>
>> Hi,
>>
>> A long time ago, I implemented a C++ class to create MP4 video files from
>> an array of images. The code works pretty well, nevertheless, I discovered
>> a deprecation warning that I want to rid off. The parameter "*codec*"
>> from the *AVStream* structure has been deprecated and I want to replace
>> it.
>>
>> Here is my current working code:
>>
>> AVOutputFormat *outputFormat = av_guess_format("ffh264", movieFile.toLocal8Bit().data(), nullptr);
>> if (!outputFormat)
>> return false;
>>
>> enum AVCodecID videoCodecID = outputFormat->video_codec;
>>
>> AVCodec *videoCodec = avcodec_find_encoder(videoCodecID);
>> if (!videoCodec)
>> return false;
>>
>> AVStream *stream = avformat_new_stream(formatContext, videoCodec);
>> if (!stream)
>> return false;
>>
>> AVCodecContext *videoCodecContext = stream->codec; // <- codec is a deprecated parameter
>>
>> videoCodecContext->width = videoW;
>> videoCodecContext->height = videoH;
>>
>> Now, to replace the "*codec*" parameter, it is recommended to use the
>> parameter "*codecpar*" (*AVCodecParameters*) that was included in the
>> AVStream structure. The usual way is this:
>>
>> if (avcodec_parameters_to_context(videoCodecContext, stream->codecpar) < 0)
>> return nullptr;
>>
>> Unfortunately, when I try to use that code, I got this problem: usually,
>> all the information stored in the *codecpar* parameter comes from the
>> data structure from a previous video file that was opened previously. In
>> other words, the information already exists. In my case, the situation is
>> different because I am creating an MP4 file from scratch so there is no
>> previous *codecpar* record to use, therefore I have to create a new
>> instance of AVCodecParameters structure by myself, setting every variable
>> manually.
>>
>> As far, I was able to set all the variables from the *codecpar*
>> structure, except for two:
>>
>> uint8_t * extradata
>> int extradata_size
>>
>> Note: currently I can create an MP4 file "successfully" without setting
>> those variables, but the file is incomplete and when I try to play it using
>> "mplayer" I got this error message:
>>
>> [extract_extradata @ 0x55b5bb7e45c0] No start code is found.
>>
>> I was researching these two fields, and it seems they store some kind of
>> information related to the codec, which in my case is H264.
>>
>> So, my specific question is: if I am setting a *codecpar* variable (
>> *AVCodecParameters*) from scratch, how can I set values for the fields
>> *extradata* and *extradata_size* in the right way for the codec H264?
>> Thanks,
>> --
>> Gustav Gonzalez
>> xtingray at gmail.com
>>
>> _______________________________________________
>> Libav-user mailing list
>> Libav-user at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/libav-user
>>
>> To unsubscribe, visit link above, or email
>> libav-user-request at ffmpeg.org with subject "unsubscribe".
>>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/libav-user
>
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org with subject "unsubscribe".
>
--
--
Gustav Gonzalez
xtingray at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20220325/29825a8a/attachment.htm>
More information about the Libav-user
mailing list