Newest 'ffmpeg' Questions - Stack Overflow

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

Les articles publiés sur le site

  • PHP script to close the ffmpeg session

    14 octobre 2016, par Kiran Kumar S

    We've made a PHP script to run the ffmpeg on a Windows 7 machine in background as below:

    <?php
    date_default_timezone_set('Asia/Kolkata');
    $date = date('dmY_His', time());
    $outputdst = ("C:/Users/test/Desktop/$date");
    $cmd = "ffmpeg -f dshow -i video=screen-capture-recorder -r 15 -t 360 $outputdst.avi ";
    
    $WshShell = new COM("WScript.Shell");
    $WshShell->Run($cmd, 0, false);
    ?>
    

    The script is able to start the screen recording. Now the issue is if I kill the process, then the recorded file is not playing. How to stop ffmpeg without corrupting the recorded file?

  • random .ts filenames in the m3u8 file

    14 octobre 2016, par Arya Same

    Hi guys my ffmpeg line currently looks like this

    ffmpeg -i "http://x.com/x.ts" -s 810x520 -pix_fmt yuv420p -vcodec copy -acodec copy -bsf:v h264_mp4toannexb -preset baseline  -strict -2 -flags -global_header -f segment -segment_list "E:\2.m3u8"  -segment_time 10 -segment_list_size 5 "E:\2-%%3d.ts"
    

    it generates .ts files like 1.ts 2.ts etc..

    but if you are gonna to look to twitch.tv's m3u8 file it looks like this

    #EXTM3U
    #EXT-X-VERSION:3
    #EXT-X-TARGETDURATION:3
    #ID3-EQUIV-TDTG:2016-10-14T12:33:35
    #EXT-X-MEDIA-SEQUENCE:345
    #EXT-X-TWITCH-ELAPSED-SYSTEM-SECS:1368.979
    #EXT-X-TWITCH-ELAPSED-SECS:1365.240
    #EXT-X-TWITCH-TOTAL-SECS:1386.919
    #EXTINF:3.440,
    index-0000000346-Am9S.ts
    #EXTINF:1.720,
    index-0000000347-Am3j.ts
    #EXTINF:3.980,
    index-0000000348-MYfR.ts
    #EXTINF:2.000,
    index-0000000349-kIwd.ts
    #EXTINF:3.300,
    index-0000000350-TpwI.ts
    #EXTINF:3.500,
    index-0000000351-MAjv.ts
    

    i want to do same is there any example ? thanks.

    best regards

  • FFMPEG command to replace first 32 bytes of mp4 file

    14 octobre 2016, par Tekriwal D

    Is there any utility or command in ffmpeg to replace first 32 bytes of video mp4 file from another key file containing 32 bytes data?

  • Making half an image transparent from the command line

    14 octobre 2016, par Alex Konetchy

    I don't really know where to start with this one. I'm trying to do something that I thought would be relatively simple to accomplish with imagemagick, but I don't know the exact command to start with. I need to draw a line through an image, and then make everything above the line transparent in the image, and make everything below the line, the orignal image. What would be the best way to accomplish this using imagemagick?

    So what I've come up with for now is to crop the image, and then resize it to the original size, but with a transparent background. The command I use is this, but it always comes out black. I'm not understanding why.

    convert -background none -gravity south out.png -resize 400x200 -extent 400x400 result.png

    Thanks for all of the help!

  • Decoding mp4/mkv using FFMPEG fails

    14 octobre 2016, par StarShine

    I'm using a project based on the latest FFmpeg git source tree, and linking to the shared DLL's published by Zeranoe at https://ffmpeg.zeranoe.com/builds/

    The playback code works and loops. It plays back h265 files (raw), mpeg, avi, and mpg files. However as soon as an mp4 or mkv container is specified as input file, regardless of what's inside,a lot of errors are dumped from the codec. It doesn't matter if it's HEVC or h264.

    [h264 @ 00000000xyz] No start code is found
    [h264 @ 00000000xyz] Error splitting the input into NAL units.
    

    To make everything really strange, ffplay.exe plays these files just fine.

    I realize that I can probably fix this by converting files into a raw format first, but I would like to be able to read and parse mp4 files a they are. Since I am using the pre-build libs of Zeraneo, my guess would be that something was not enabled during the build, but then I would expect ffplay to fail too. Do I need to set a flag in the format_context or codec_context, or provide some sort of filter identifier?

    Movies that play fine came from http://bbb3d.renderfarming.net/download.html, http://www.w6rz.net/ and http://www.sample-videos.com/

    These work:

    big_buck_bunny_480p_surround-fix.avi
    bigbuckbunny_480x272.h265
    

    Being a total noob at ffmpeg, please help me understand what is wrong and how to fix it. If the pre-build libs are the culprit, then the second question is if someone has a convenient cmake setup to build this for windows X64 and x32 debug and release targets.

    Here's the source for initializing ffmpeg for reading

    avdevice_register_all();
    avfilter_register_all();
    av_register_all();
    avformat_network_init();
    

    The format is parsed as follows:

    m_FormatContext = avformat_alloc_context();
    if (avformat_open_input(&m_FormatContext, file.GetPath().ToString().c_str(), NULL, NULL) != 0) 
    {
        //std::cout << "failed to open input" << std::endl;
        success = false;
    }
    // find stream info
    if (success)
    {
        if (avformat_find_stream_info(m_FormatContext, NULL) < 0) 
        {
            //std::cout << "failed to get stream info" << std::endl;
            success = false;
        }
    }
    

    The stream is opened as follows:

    m_VideoStream = avstream;
    m_FormatContext = formatContext;
    if (m_VideoStream)
    {
        m_StreamIndex = m_VideoStream->stream_identifier;
        AVCodecParameters *codecpar = m_VideoStream->codecpar;      
        if (codecpar)
        {
            AVCodecID codec_id = codecpar->codec_id;
            m_Decoder = avcodec_find_decoder(codec_id);
            if (m_Decoder)
            {
                m_CodecContext = avcodec_alloc_context3(m_Decoder);
                if (m_CodecContext)
                {
                    m_CodecContext->width = codecpar->width;                    
                    m_CodecContext->height = codecpar->height;
                    m_VideoSize = i3(codecpar->width, codecpar->height,1);
                    success = 0 == avcodec_open2(m_CodecContext, m_Decoder, NULL);
                    if (success)
                    {
                        if(m_CodecContext)
                        {
                            int size = av_image_get_buffer_size(format, m_CodecContext->width, m_CodecContext->height, 1);      
                            if (size > 0)
                            {
                                av_frame = av_frame_alloc();
                                gl_frame = av_frame_alloc();        
                                uint8_t *internal_buffer = (uint8_t *)av_malloc(size * sizeof(uint8_t));
                                av_image_fill_arrays((uint8_t**)((AVPicture *)gl_frame->data), (int*) ((AVPicture *)gl_frame->linesize), internal_buffer, format, m_CodecContext->width, m_CodecContext->height,1);
                                m_Packet = (AVPacket *)av_malloc(sizeof(AVPacket));
                            }
                        }
                    }
                    if (!success) 
                    {
                        avcodec_close(m_CodecContext);
                        avcodec_free_context(&m_CodecContext);
                        m_CodecContext = NULL;
                        m_Decoder = NULL;
                        m_VideoStream = NULL;
                    }
                }
                else
                {
                    m_Decoder = NULL;
                    m_VideoStream = NULL;
                }
            }
        }
    }
    

    And dedoding on a single thread:

    do 
    {
        if (av_read_frame(m_FormatContext, m_Packet) < 0) 
        {
            av_packet_unref(m_Packet);
            m_AllPacketsSent = true;
        }
        else
        {
            if (m_Packet->stream_index == m_StreamIndex) 
            {                   
                avcodec_send_packet(m_CodecContext, m_Packet);
            }
        }
    
        int frame_finished = avcodec_receive_frame(m_CodecContext, av_frame);
        if (frame_finished == 0) 
        {
            if (!conv_ctx) 
            {
                conv_ctx = sws_getContext(m_CodecContext->width, 
                    m_CodecContext->height, m_CodecContext->pix_fmt, 
                    m_CodecContext->width, m_CodecContext->height, format, SWS_BICUBIC, NULL, NULL, NULL);
            }
    
            sws_scale(conv_ctx, av_frame->data, av_frame->linesize, 0, m_CodecContext->height, gl_frame->data, gl_frame->linesize);
    
            switch(format)
            {
                case AV_PIX_FMT_BGR32_1:
                case AV_PIX_FMT_RGB32_1:
                case AV_PIX_FMT_0BGR32:
                case AV_PIX_FMT_0RGB32:
                case AV_PIX_FMT_BGR32:  
                case AV_PIX_FMT_RGB32:              
                {
                    m_CodecContext->bits_per_raw_sample = 32; break;                    
                }
                default:
                {
                    FWASSERT(format == AV_PIX_FMT_RGB32, "The format changed, update the bits per raw sample!"); break;
                }
            }
    
    
            size_t bufferSize = m_CodecContext->width * m_CodecContext->height * m_CodecContext->bits_per_raw_sample / 8;
            m_Buffer.Realloc(bufferSize, false,  gl_frame->data[0]);
            m_VideoSize = i3(m_CodecContext->width, m_CodecContext->height,1);
            result = true;
            // sends the image buffer straight to the locked texture here..
            // glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, codec_ctx->width, codec_ctx->height, GL_RGB, GL_UNSIGNED_BYTE, gl_frame->data[0]);
        }
    
        av_packet_unref(m_Packet);
    } while (m_Packet->stream_index != m_StreamIndex);
    
    m_FrameDecoded = result;
    

    Any insight is appreciated!