Newest 'ffmpeg' Questions - Stack Overflow

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

Les articles publiés sur le site

  • about ffmpeg drawtext contains chinses

    8 novembre 2013, par user2968187

    When i use below command (ffmpeg drawtext filter), the result window display messy code □□.

    How to solve the problem ?

       ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=中文
    

    thanks very much

  • What the correct args for ffmpeg conversion

    8 novembre 2013, par Andrew Simpson

    I have a C# app. I am using ffmpge to convert jpgs to an OGG file. I use the process class to write to a stream buffer within my app using piping without having to write the ogg file to a disk. I then upload these bytes to my server where it is written to the hard drive.

    On the server side I want to convert it to say an mp4 format. Again, I want to pipe it out to a stream buffer and allow my User to download the file.

    This is my code:

    Process _serverBuild = null;

    public byte[] EncodeAndUploadImages(string _args1)
    {
        byte[] _data = null;
        try
        {
            _args1 = "ffmpeg.exe -i \"c:\\Cloud\\Zipped\\000EC902F17F\\f3e45e44-b61c-472b-8dc1-a8e9b9511497_00007.ogg\" avi -";
            _serverBuild = new Process();
    
            _serverBuild.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
            _serverBuild.StartInfo.Arguments = _args1;
            _serverBuild.StartInfo.FileName =  @"C:\inetpub\wwwroot\bin\ffmpeg.exe";
            _serverBuild.StartInfo.UseShellExecute = false;
            _serverBuild.StartInfo.RedirectStandardOutput = true;
            _serverBuild.StartInfo.RedirectStandardError = true;
            _serverBuild.StartInfo.RedirectStandardInput = true;
            _serverBuild.StartInfo.CreateNoWindow = true;
            _serverBuild.StartInfo.LoadUserProfile = false;
            _serverBuild.ErrorDataReceived += _server_ErrorDataReceived;
            _serverBuild.OutputDataReceived += _server_OutputDataReceived;
            _serverBuild.Exited += new EventHandler(_server_Exited);
            _serverBuild.EnableRaisingEvents = true;
            _serverProcessHasFinished = false;
            _serverBuild.Start();
    
            mStandardOutput = _serverBuild.StandardOutput.BaseStream;
            mStandardOutput.BeginRead(mReadBuffer, 0, mReadBuffer.Length, StandardOutputReadCallback, null);            
            _serverBuild.WaitForExit();
    
    
    
    
        }
        catch (Exception _ex)
        {
    
        }
        finally
        {
            _serverBuild.ErrorDataReceived -= _server_ErrorDataReceived;
            _serverBuild.OutputDataReceived -= _server_OutputDataReceived;
            _serverBuild.Dispose();
        }
        return _data;
    }
    
    byte[] mReadBuffer = new byte[4096];
    MemoryStream mStandardOutputMs = new MemoryStream();
    Stream mStandardOutput;
    
    private void StandardOutputReadCallback(IAsyncResult ar)
    {
        try
        {
            int numberOfBytesRead = mStandardOutput.EndRead(ar);
            {
                mStandardOutputMs.Write(mReadBuffer, 0, numberOfBytesRead);
                mStandardOutput.BeginRead(mReadBuffer, 0, mReadBuffer.Length, StandardOutputReadCallback, null);
            }
        }
        catch (Exception _ex)
        {
    
        }
    }
    

    The error I get (when I test with a bat file and run within a DOS prompt) is:

    enter image description here

    Obviously my parameters are at fault. I want to keep it simple as I may want to use other formats apart from MP4.

    Thanks

  • FFMpeg encoded video will only play in FFPlay

    8 novembre 2013, par mohM

    I've been debugging my program for a couple of weeks now with the output video only showing a blank screen (was testing with VLC, WMP and WMPClassic). I happened to try using FFPlay and lo and behold the video works perfectly. I've read that this is usually caused by an incorrect pixel format, and that switching to PIX_FMT_YUV420P will make it work universally...but I'm already using that pixel format in the encoding process. Is there anything else that is causing this?

    AVCodec* codec;
    AVCodecContext* c = NULL;
    uint8_t* outbuf;
    int i, out_size, outbuf_size;
    
    avcodec_register_all();
    
    printf("Video encoding\n");
    
    // Find the mpeg1 video encoder
    codec = avcodec_find_encoder(CODEC_ID_H264);
    if (!codec) {
        fprintf(stderr, "Codec not found\n");
        exit(1);
    }
    else printf("H264 codec found\n");
    
    c = avcodec_alloc_context3(codec);
    
    c->bit_rate = 400000;
    c->width = 1920;                                        // resolution must be a multiple of two (1280x720),(1900x1080),(720x480)
    c->height = 1200;
    c->time_base.num = 1;                                   // framerate numerator
    c->time_base.den = 25;                                  // framerate denominator
    c->gop_size = 10;                                       // emit one intra frame every ten frames
    c->max_b_frames = 1;                                    // maximum number of b-frames between non b-frames
    //c->keyint_min = 1;                                        // minimum GOP size
    //c->i_quant_factor = (float)0.71;                      // qscale factor between P and I frames
    //c->b_frame_strategy = 20;
    //c->qcompress = (float)0.6;
    //c->qmin = 20;                                         // minimum quantizer
    //c->qmax = 51;                                         // maximum quantizer
    //c->max_qdiff = 4;                                     // maximum quantizer difference between frames
    //c->refs = 4;                                          // number of reference frames
    //c->trellis = 1;                                           // trellis RD Quantization
    c->pix_fmt = PIX_FMT_YUV420P;
    c->codec_id = CODEC_ID_H264;
    //c->codec_type = AVMEDIA_TYPE_VIDEO;
    
    // Open the encoder
    if (avcodec_open2(c, codec,NULL) < 0) {
        fprintf(stderr, "Could not open codec\n");
        exit(1);
    }
    else printf("H264 codec opened\n");
    
    outbuf_size = 100000 + c->width*c->height*(32>>3);//*(32>>3);           // alloc image and output buffer
    outbuf = static_cast(malloc(outbuf_size));
    printf("Setting buffer size to: %d\n",outbuf_size);
    
    FILE* f = fopen("example.mpg","wb");
    if(!f) printf("x  -  Cannot open video file for writing\n");
    else printf("Opened video file for writing\n");
    
    // encode 5 seconds of video
    for(i=0;iwidth, c->height);
        uint8_t* outbuffer = (uint8_t*)av_malloc(nbytes*sizeof(uint8_t));
    
        AVFrame* inpic = avcodec_alloc_frame();
        AVFrame* outpic = avcodec_alloc_frame();
    
        outpic->pts = (int64_t)((float)i * (1000.0/((float)(c->time_base.den))) * 90);
        avpicture_fill((AVPicture*)inpic, (uint8_t*)pPixels, PIX_FMT_RGB32, c->width, c->height);                   // Fill picture with image
        avpicture_fill((AVPicture*)outpic, outbuffer, PIX_FMT_YUV420P, c->width, c->height);
        av_image_alloc(outpic->data, outpic->linesize, c->width, c->height, c->pix_fmt, 1); 
    
        inpic->data[0] += inpic->linesize[0]*(screenHeight-1);                                                      // Flipping frame
        inpic->linesize[0] = -inpic->linesize[0];                                                                   // Flipping frame
    
        struct SwsContext* fooContext = sws_getContext(screenWidth, screenHeight, PIX_FMT_RGB32, c->width, c->height, PIX_FMT_YUV420P, SWS_FAST_BILINEAR, NULL, NULL, NULL);
        sws_scale(fooContext, inpic->data, inpic->linesize, 0, c->height, outpic->data, outpic->linesize);
    
        // encode the image
        out_size = avcodec_encode_video(c, outbuf, outbuf_size, outpic);
        printf("Encoding frame %3d (size=%5d)\n", i, out_size);
        fwrite(outbuf, 1, out_size, f);
        delete [] pPixels;
        av_free(outbuffer);     
        av_free(inpic);
        av_free(outpic);
    }
    
    // get the delayed frames
    for(; out_size; i++) {
        fflush(stdout);
    
        out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
        printf("Writing frame %3d (size=%5d)\n", i, out_size);
        fwrite(outbuf, 1, out_size, f);
    }
    
    // add sequence end code to have a real mpeg file
    outbuf[0] = 0x00;
    outbuf[1] = 0x00;
    outbuf[2] = 0x01;
    outbuf[3] = 0xb7;
    fwrite(outbuf, 1, 4, f);
    fclose(f);
    
    avcodec_close(c);
    free(outbuf);
    av_free(c);
    printf("Closed codec and Freed\n");
    
  • ffmpeg - how do I remove a sweep line seen

    8 novembre 2013, par eduard

    I am streaming a video over network(rtp) which uses x264 and ffmpeg's h264 on the other side. Everything is OK as far as there is no packet loss. When there are packet loss it fixed when key-frame arives. Instead of immediate refresh it takes about 1-1.5 seconds and it seems like a sweep line which 'cleans' the errors.

    Is there a way to make key frames fix errors immediately?

  • Make thumbs from videos with ffmpeg and php [on hold]

    8 novembre 2013, par Milan Milosevic

    Im try extract small thumbs from video every 15 sec.

    Here is what im try now

    ffmpeg -i movie.mp4 -r 1/15 -s 120x90 %03d.jpg
    

    But have some error from command line

    [mjpeg @ 0x9e695c0] bitrate tolerance too small for bitrate
    [mjpeg @ 0x9da9a60] ff_frame_thread_encoder_init failed
    Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
    

    Whats wrong here, and how to get thumbs every 15 sec. and save it 0.jpg,1jpg,2jpg,3jpg,4jpg,5jpg...etc..