[Libav-user] How to changes resolution to output file.

Yurii Monakov monakov.y at gmail.com
Sun Mar 3 07:28:59 EET 2019


Hi!

You should decode input packets from camera to AVFrames using decoding API.
After that it will be possible to change video frame resolution and encode
scaled frames into video file with encoding API.


чт, 28 февр. 2019 г. в 18:39, ABDALLAH Moussa <Moussa.ABDALLAH at nexeya.com>:

> After many try to change resolution of my output video file, I failed.. I
> didn’t understand how to use the function sws_scale() with AVPacket where
> is my stream video.
>
> Could you help me please ?
>
>
>
> This is my source code :
>
> #include <stdio.h>
>
> #include <stdlib.h>
>
> #include <string.h>
>
> #include <unistd.h>
>
> #include <iostream>
>
> #include <fstream>
>
> #include <sstream>
>
>
>
> extern "C" {
>
> #include <libavcodec/avcodec.h>
>
> #include <libavformat/avformat.h>
>
> #include <libavformat/avio.h>
>
> #include <libswscale/swscale.h>
>
> }
>
>
>
> int main(int argc, char** argv) {
>
>
>
>     // Open the initial context variables that are needed
>
>     AVFormatContext* ifcx = NULL;
>
>     AVCodecContext* cctx = NULL;
>
>     AVStream        * ivst = NULL;
>
>     int     i_vindex;
>
>     int     got_key_frame = 0;
>
>
>
>     AVFormatContext * ofcx;
>
>     AVOutputFormat  * ofmt;
>
>     AVStream        * ovst = NULL, * oast = NULL;
>
>
>
>     AVPacket        pkt;
>
>     int         ix;
>
>     struct SwsContext *resize;
>
>
>
>     // pts computing
>
>     AVRational      vPtsFactor, aPtsFactor = { 0, 0 } ;
>
>
>
>     // Register everything
>
>    // av_register_all();
>
>    // avformat_network_init();
>
>     printf("1\n");
>
>     //open http
>
>     if (avformat_open_input(&ifcx, "http://192.9.200.121/ipcam/mjpeg.cgi",
>
>             NULL, NULL) != 0) {
>
>         return EXIT_FAILURE;
>
>     }
>
>
>
>     if (avformat_find_stream_info(ifcx, NULL) < 0) {
>
>         return EXIT_FAILURE;
>
>     }
>
>     printf("2\n");
>
>     //search video stream
>
>     i_vindex = -1;
>
>     for (ix = 0; ix < (int) ifcx->nb_streams; ix++) {
>
>         // Get the codec
>
>         cctx = ifcx->streams[ ix ]->codec;
>
>         if (cctx->codec_type == AVMEDIA_TYPE_VIDEO)
>
>         {
>
>             ivst = ifcx->streams[ ix ];
>
>             i_vindex = ix;
>
>             continue ;
>
>         }
>
>     }
>
>         if ( i_vindex < 0 )
>
>         {
>
>             printf( "KNC230ERROR: Cannot find input video stream\n" );
>
>             avformat_close_input( &ifcx );
>
>         }
>
>     printf("3\n");
>
>
>
>        //open output file -------------------------------------------
>
>         ofmt = av_guess_format( NULL, "/home/Nexeya/capture6.mkv", NULL );
>
>         ofcx = avformat_alloc_context();
>
>         ofcx->oformat = ofmt;
>
>         avio_open2( &ofcx->pb, "/home/Nexeya/capture6.mkv",
> AVIO_FLAG_WRITE, NULL, NULL );
>
> printf("4\n");
>
>         // Create video output stream
> -------------------------------------------
>
>         //ovst = avformat_new_stream( ofcx, (AVCodec *) cctx->codec );
>
>         ovst = avformat_new_stream( ofcx, NULL );
>
>         avcodec_copy_context( ovst->codec, cctx);
>
>
>
>         ovst->sample_aspect_ratio.num = cctx->sample_aspect_ratio.num;
>
>         ovst->sample_aspect_ratio.den = cctx->sample_aspect_ratio.den;
>
> printf("5\n");
>
>         // Assume r_frame_rate is accurate
>
>         ivst->r_frame_rate.num=25;
>
>         ivst->r_frame_rate.den=1;
>
>         ovst->r_frame_rate      = ivst->r_frame_rate;
>
>         ovst->avg_frame_rate    = ovst->r_frame_rate;
>
> printf("6\n");
>
>         // Initialize many things ...
>
>         avformat_write_header( ofcx, NULL );
>
>
>
>         snprintf( ofcx->filename, sizeof( ofcx->filename ), "%s",
> "/home/Nexeya/capture6.mkv" );
>
>
>
>         // Video pts conversion factor
>
>         // The input and output time_base may be different
>
>         vPtsFactor.num = ivst->time_base.num * ovst->time_base.den ;
>
>         vPtsFactor.den = ivst->time_base.den * ovst->time_base.num ;
>
>         ix = (uint32_t) av_gcd (vPtsFactor.num, vPtsFactor.den) ;
>
>         vPtsFactor.num /= ix ;
>
>         vPtsFactor.den /= ix ;
>
> printf("7\n");
>
>
>
>         resize = sws_getContext(cctx->width, cctx->height,
> AV_PIX_FMT_YUV420P, 320, 240, AV_PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL,
> NULL);
>
>         //start reading pkts from stream and write them to file
>
>         printf("Start record\n");
>
>         av_init_packet( &pkt );
>
>         int ii=0;
>
>         while (ii<258)
>
>         {
>
>             if (av_read_frame (ifcx, & pkt) >= 0)
>
>             {
>
>                 // Make sure we start on a key video frame
>
>                 if (got_key_frame == 0)
>
>                 {
>
>                     if (pkt.stream_index == i_vindex)
>
>                     {
>
>                         if (pkt.flags & AV_PKT_FLAG_KEY)
>
>                         {
>
>                             got_key_frame = 1;
>
>                         }
>
>                         else
>
>                             continue ; // Not key frame
>
>                     }
>
>                 }
>
>
>
>                 // Manage pkt
>
>
>
>                 // pts can be AV_NOPTS_VALUE = 0x8000... at start
>
>                 if (pkt.pts == AV_NOPTS_VALUE)
>
>                     pkt.pts = pkt.dts = 0 ;
>
>
>
>                 if ( pkt.stream_index == i_vindex )
>
>                 {
>
>                     // pkt is video
>
>
>
>                     pkt.stream_index = ovst->id;
>
>
>
>                     // Compute pts
>
>                     pkt.pts = pkt.dts = (pkt.pts * vPtsFactor.num) /
> vPtsFactor.den ;
>
>                     sws_scale(resize, pkt.data, pkt.linesize, 0, cctx->
> height, pkt.data, pkt.linesize);
>
>                     av_write_frame( ofcx, &pkt );
>
>                 }
>
>
>
>                 av_free_packet( &pkt );
>
>                 av_init_packet( &pkt );
>
>             }
>
>             ii++;
>
>         }
>
>         printf("End record\n");
>
>         // Stop command received
>
>         av_read_pause           ( ifcx );
>
>         av_write_trailer        ( ofcx );
>
>         avio_close              ( ofcx->pb );
>
>         avformat_close_input    ( & ifcx );
>
>         avformat_free_context   ( ofcx );
>
>     return (EXIT_SUCCESS);
>
> }
>
>
>
> Thanks you very much for your help.
>
>
>
> *De :* Libav-user <libav-user-bounces at ffmpeg.org> *De la part de* Michael
> Armes
> *Envoyé :* mercredi 27 février 2019 22:27
> *À :* This list is about using libavcodec, libavformat, libavutil,
> libavdevice and libavfilter. <libav-user at ffmpeg.org>
> *Objet :* Re: [Libav-user] How to changes resolution to output file.
>
>
>
> I did not find that setting bitrate had any effect in my scenarios with
> mp4/mov. I had to manually control my color depth and resolution (and set
> framerate) to hit my desired bitrate. I never did have to convert pixel
> formats, but my read of the docs is that sws_scale can do this as long as
> you set your SwsContext appropriately.
>
>
>
> On Wed, Feb 27, 2019 at 11:08 AM ABDALLAH Moussa <
> Moussa.ABDALLAH at nexeya.com> wrote:
>
> Thanks you for your help!
>
> To change the bit_rate I have to use sw_scale too?
>
>
> Le 27 févr. 2019 à 18:49, Michael Armes <michael.armes at gmail.com> a
> écrit :
>
> You need to scale *each frame* with sws_scale from lib_av (
> https://libav.org/documentation/doxygen/master/group__libsws.html#gae531c9754c9205d90ad6800015046d74).
> I suggest you look at the example code linked in the documentation for
> reference.
>
>
>
> On Wed, Feb 27, 2019 at 9:38 AM ABDALLAH Moussa <
> Moussa.ABDALLAH at nexeya.com> wrote:
>
> Hello,
>
>
>
> I am trying to record a stream video to a output file mkv. I set my camera
> with the resolution 1280x720 and I would like to change it with ffmpeg on
> my program how can I do that please ?
>
>
>
> I have success to change the framerate but I failed  with the resolution
> or other option like bit_rate :
>
>
>
>         ivst->r_frame_rate.num=25;
>
>         ivst->r_frame_rate.den=1;
>
>         ovst->r_frame_rate      = ivst->r_frame_rate;
>
>         ovst->avg_frame_rate    = ovst->r_frame_rate;
>
>         ivst->codec->bit_rate = 3000000;
>
>         ovst->codec->bit_rate = 3000000;
>
>         ivst->codec->height = 320;
>
>         ivst->codec->width = 240;
>
>         ovst->codec->height = 320;
>
>         ovst->codec->width = 240;
>
>
>
> Thanks you for your help !
>
> _______________________________________________
> 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".
>
> _______________________________________________
> 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".
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20190303/fb354dd5/attachment.html>


More information about the Libav-user mailing list