Newest 'libx264' Questions - Stack Overflow

http://stackoverflow.com/questions/tagged/libx264

Les articles publiés sur le site

  • fps porblem when saving video in mp4 container

    27 novembre 2012, par theateist

    When I decode frames from avi file and then decode them in x264 and save to mp4 file, the fps of the output file is always 12,800. Therefore the file is played very fast. But, when I save the encoded in h264 frames in avi format and not mp4, so the fps is as I wanted - 25.

    What could be the problem? This is very urgent to me. I'm stuck with this and cannot continue with my project!

    Here the code I wrote in VS2010:

    #include "stdafx.h"
    #include "inttypes.h"
    
    extern "C" {
    #include "libavcodec/avcodec.h"
    #include "libavformat/avformat.h"
    #include "libavutil/avutil.h"
    #include swscale.h>
    #include opt.h>
    #include swscale.h>
    #include imgutils.h>
    }
    
    #include 
    using namespace std;
    
    int main(int argc, char* argv[])
    {
       const char* inFileName = "C:\\000227_C1_GAME.avi";
       const char* outFileName = "c:\\test.avi";
       const char* outFileType = "avi";
    
       av_register_all();
    
       AVFormatContext* inContainer = NULL;   
       if(avformat_open_input(&inContainer, inFileName, NULL, NULL) < 0)   
          exit(1);
    
       if(avformat_find_stream_info(inContainer, NULL) < 0)
          exit(1);
    
       // Find video stream
       int videoStreamIndex = -1;
       for (unsigned int i = 0; i < inContainer->nb_streams; ++i)
       {
          if (inContainer->streams[i] && inContainer->streams[i]->codec &&
             inContainer->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
          {
             videoStreamIndex = i;
             break;
          }
       }
       if (videoStreamIndex == -1) exit(1);
    
       AVFormatContext* outContainer = NULL;
       if(avformat_alloc_output_context2(&outContainer, NULL, outFileType, outFileName) < 0)
          exit(1);
    
       // ---------------------------- 
       // Decoder
       // ---------------------------- 
       AVStream const *const inStream = inContainer->streams[videoStreamIndex];
       AVCodec *const decoder = avcodec_find_decoder(inStream->codec->codec_id);
       if(!decoder) 
          exit(1);
       if(avcodec_open2(inStream->codec, decoder, NULL) < 0) 
          exit(1);
    
       // ---------------------------- 
       // Encoder
       // ----------------------------             
       AVCodec *encoder = avcodec_find_encoder(AV_CODEC_ID_H264);
       if(!encoder) 
          exit(1);
       AVStream *outStream = avformat_new_stream(outContainer, encoder);      
       if(!outStream)
          exit(1);
       avcodec_get_context_defaults3(outStream->codec, encoder);   
    
       // Construct encoder
       if(outContainer->oformat->flags & AVFMT_GLOBALHEADER) 
          outStream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;   
    
       outStream->codec->coder_type = AVMEDIA_TYPE_VIDEO;
       outStream->codec->pix_fmt = AV_PIX_FMT_YUV420P;
       outStream->codec->width = inStream->codec->width;
       outStream->codec->height = inStream->codec->height;
       outStream->codec->codec_id = encoder->id;
       outStream->codec->bit_rate = 500000;
       //outStream->codec->rc_min_rate = 600000;
       //outStream->codec->rc_max_rate = 800000;
    
       outStream->codec->time_base.den = 25;
       outStream->codec->time_base.num = 1;
       outStream->codec->gop_size = 250; // Keyframe interval(=GOP length). Determines maximum distance distance between I-frames
       outStream->codec->keyint_min = 25; // minimum GOP size
       outStream->codec->max_b_frames = 3;//16; // maximum number of B-frames between non-B-frames
       outStream->codec->b_frame_strategy = 1; // decides the best number of B-frames to use. Default mode in x264.
       outStream->codec->scenechange_threshold = 40;
       outStream->codec->refs = 6; // abillity to reference frames other than the one immediately prior to the current frame. specify how many references can be used.
       outStream->codec->qmin = 0;//10;
       outStream->codec->qmax = 69;//51;
       outStream->codec->qcompress = 0.6;
       outStream->codec->max_qdiff = 4;
       outStream->codec->i_quant_factor = 1.4;//0.71;   
    
       outStream->codec->refs=1;//3;
       outStream->codec->chromaoffset = -2;
       outStream->codec->thread_count = 1;   
       outStream->codec->trellis = 1;
       outStream->codec->me_range = 16;
       outStream->codec->me_method = ME_HEX; //hex
       outStream->codec->flags2 |= CODEC_FLAG2_FAST;   
       outStream->codec->coder_type = 1;
    
    
       if(outStream->codec->codec_id == AV_CODEC_ID_H264)
       {
            av_opt_set(outStream->codec->priv_data, "preset", "slow", 0);
       }
    
       // Open encoder
       if(avcodec_open2(outStream->codec, encoder, NULL) < 0) 
          exit(1);
    
       // Open output container
       if(avio_open(&outContainer->pb, outFileName, AVIO_FLAG_WRITE) < 0)
          exit(1);
    
       //close_o
    
       AVFrame *decodedFrame = avcodec_alloc_frame();
       if(!decodedFrame) 
          exit(1);
       AVFrame *encodeFrame = avcodec_alloc_frame();
       if(!encodeFrame) 
          exit(1);
       encodeFrame->format = outStream->codec->pix_fmt;
       encodeFrame->width = outStream->codec->width;
       encodeFrame->height = outStream->codec->height;
       if(av_image_alloc(encodeFrame->data, encodeFrame->linesize, 
                     outStream->codec->width, outStream->codec->height, 
                     outStream->codec->pix_fmt, 1) < 0)
          exit(1);
    
       av_dump_format(inContainer, 0, inFileName,0);
    
       //Write header to ouput container
       avformat_write_header(outContainer, NULL);
    
       AVPacket decodePacket, encodedPacket;
       int got_frame, len;
       while(av_read_frame(inContainer, &decodePacket)>=0)
       {      
          if (decodePacket.stream_index == videoStreamIndex)
          {                  
             len = avcodec_decode_video2(inStream->codec, decodedFrame, &got_frame, &decodePacket);
             if(len < 0)
                exit(1);
             if(got_frame)
             {
                av_init_packet(&encodedPacket);
                encodedPacket.data = NULL;
                encodedPacket.size = 0;         
                if(avcodec_encode_video2(outStream->codec, &encodedPacket, decodedFrame, &got_frame) < 0)
                   exit(1);
                if(got_frame)
                {
                   if (outStream->codec->coded_frame->key_frame)
                      encodedPacket.flags |= AV_PKT_FLAG_KEY;
    
                   encodedPacket.stream_index = outStream->index;
    
                   if(av_interleaved_write_frame(outContainer, &encodedPacket) < 0)
                      exit(1);
    
                   av_free_packet(&encodedPacket);
                }
             }
          }
    
          av_free_packet(&decodePacket);
       }
       av_write_trailer(outContainer);
       avio_close(outContainer->pb);
    
       avcodec_free_frame(&encodeFrame);
       avcodec_free_frame(&decodedFrame);
    
       avformat_free_context(outContainer);
       av_close_input_file(inContainer);
       return 0;
    }
    
  • Dump libx264 encoding parameters in ffmpeg

    23 novembre 2012, par melih

    Is it possible to get a list of parameter values used in libx264 while encoding a stream? I am using a ffmpeg binary to encode.

  • Is it possible to force I_PCM mode in x264 ?

    10 octobre 2012, par cloudraven

    I need to use I_PCM mode in all blocks for some of I frames in video being compressed using x264. I know those frames will take a huge amount of space, but it is a requirement to keep them as faithful to the source as possible and to make them very fast to encode / decode (I_PCM should be super fast and lossless). Is there a way to force x264 to programatically do this. I am using libx264 to do this, but I haven't found a way to specify custom macroblock type within a given frame. If it is not supported, how hard would it be to modify the library to do so and where should I look at first?

  • Linking FFmpeg against libx264 while using -fwhole-program

    5 octobre 2012, par Philos

    If I compile libx264 using -fwhole-program then go to compile ffmpeg without using -fwhole-program and then link it against ffmpeg will that cause a compiler issue? (and vice versa)

    Likewise, could doing that cause a performance hit even if it doesn't cause a compiler issue?

  • How do I build ffmpeg including x264 library for android ?

    27 septembre 2012, par user1093191

    Lots of question and answer available on the ffmpeg and android. But I did not get thing that directly address ffmpeg building with x264 library.

    Actually I want to make a movie from some still images in android.

    Still do not get any solution to resolve this problem. Some of the forum told that it can be do using ffmpeg. If I build ffmpeg after downloading from "http://bambuser.com/opensource", it works fine to decode a video file. But it does not get any codec while it try to encode still image into movie.

    That's why I try to use x264 as encoding library with ffmpeg. While I try to build it with ffmpeg it returns error.

    Could you please provide any detail step by step guide line to build ffmpeg with x264 library in windows or mac for android?

    If any one knows anything other that can be used to make movie from still images in android please tell me the way. Your help will be highly appreciated.

    Thank you in advance for your kind response.