Hi! Thanks you for your answer. When I tried to do this, I had an error in the enconding step. I got on the console a message whixh tell me that I can’t use the function avcodec_encode_video2() but I have to use avcodec_send_frame() and avcodec_receive_packet().
Le 3 mars 2019 à 06:30, Yurii Monakov <[email protected]<mailto:[email protected]>> a écrit : 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 <[email protected]<mailto:[email protected]>>: 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 <[email protected]<mailto:[email protected]>> 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. <[email protected]<mailto:[email protected]>> 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 <[email protected]<mailto:[email protected]>> 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 <[email protected]<mailto:[email protected]>> 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 <[email protected]<mailto:[email protected]>> 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 [email protected]<mailto:[email protected]> https://ffmpeg.org/mailman/listinfo/libav-user To unsubscribe, visit link above, or email [email protected]<mailto:[email protected]> with subject "unsubscribe". _______________________________________________ Libav-user mailing list [email protected]<mailto:[email protected]> https://ffmpeg.org/mailman/listinfo/libav-user To unsubscribe, visit link above, or email [email protected]<mailto:[email protected]> with subject "unsubscribe". _______________________________________________ Libav-user mailing list [email protected]<mailto:[email protected]> https://ffmpeg.org/mailman/listinfo/libav-user To unsubscribe, visit link above, or email [email protected]<mailto:[email protected]> with subject "unsubscribe". _______________________________________________ Libav-user mailing list [email protected]<mailto:[email protected]> https://ffmpeg.org/mailman/listinfo/libav-user To unsubscribe, visit link above, or email [email protected]<mailto:[email protected]> with subject "unsubscribe". _______________________________________________ Libav-user mailing list [email protected]<mailto:[email protected]> https://ffmpeg.org/mailman/listinfo/libav-user To unsubscribe, visit link above, or email [email protected]<mailto:[email protected]> with subject "unsubscribe".
_______________________________________________ Libav-user mailing list [email protected] https://ffmpeg.org/mailman/listinfo/libav-user To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
