Newest 'libx264' Questions - Stack Overflow

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

Les articles publiés sur le site

  • How to encode h.264 with libavcodec/x264 ?

    23 décembre 2016, par szatmary

    I am attempting to encode video using libavcodec/libavformat. Audio works great, but when I try to encode video I get the following errors:

    [libx264 @ 0x10182a000]broken ffmpeg default settings detected  
    [libx264 @ 0x10182a000]use an encoding preset (vpre)  
    

    easy to fix using the command line ffmpeg, but I am trying to do this in C. my options are

    AVStream *pVideoOutStream = av_new_stream(pOutFormatCtx, 0);  
    AVCodecContext *pVideoOutCodecCtx  = pVideoOutStream->codec;  
    
    pVideoOutCodecCtx->codec_id        = CODEC_ID_H264;    
    pVideoOutCodecCtx->codec_type      = CODEC_TYPE_VIDEO;  
    pVideoOutCodecCtx->bit_rate        = pVideoInCodecCtx->bit_rate;  
    pVideoOutCodecCtx->width           = pVideoInCodecCtx->width;    
    pVideoOutCodecCtx->height          = pVideoInCodecCtx->height;  
    pVideoOutCodecCtx->pix_fmt         = pVideoInCodecCtx->pix_fmt;    
    pVideoOutCodecCtx->sample_rate     = pVideoInCodecCtx->sample_rate;    
    pVideoOutCodecCtx->gop_size        = 30;  
    

    but avcodec_open() fails.

    What other values do I need to set to make x264 happy?

  • How to wrap a C library parameter ?(Creating x264 .Net wrapper)

    6 décembre 2016, par Rella

    so in dll we have x264_param_t structure\object and a function for its setting up x264_param_apply_profile. in C we use such code to set it up

    x264_param_t param;
    x264_param_default_preset(&param, "veryfast", "zerolatency");
    param.i_threads = 1;
    param.i_width = width;
    param.i_height = height;
    param.i_fps_num = fps;
    param.i_fps_den = 1;
    // Intra refres:
    param.i_keyint_max = fps;
    param.b_intra_refresh = 1;
    //Rate control:
    param.rc.i_rc_method = X264_RC_CRF;
    param.rc.f_rf_constant = 25;
    param.rc.f_rf_constant_max = 35;
    //For streaming:
    param.b_repeat_headers = 1;
    param.b_annexb = 1;
    x264_param_apply_profile(&param, "baseline");
    

    I want to create wrapper for such.. thing. so I have libx264.dll and visual studio 2010 pro.

    How can I create .Net C# wrapper for it?

    I am a beginner in P\Invoke stuff so I do not get a lot of it...

    what I want to achive is is frame by frame level of working with x264... By now I need only encoding parts... And all needed sample code for doing it in C is in How does one encode a series of images into H264 using the x264 C API? . So I need to write a wrapper only for stuff mentioned there... So I am asking - how to create a wrapper on Parameter and on Function that sets up thap param. And I would love to see how to call that wrapper back from c#. So if you could provide any code in support I'd be glad to see it.

  • How to wrap a C library parameter ?(Creating x264 .Net wrapper)

    6 décembre 2016, par Rella

    so in dll we have x264_param_t structure\object and a function for its setting up x264_param_apply_profile. in C we use such code to set it up

    x264_param_t param;
    x264_param_default_preset(&param, "veryfast", "zerolatency");
    param.i_threads = 1;
    param.i_width = width;
    param.i_height = height;
    param.i_fps_num = fps;
    param.i_fps_den = 1;
    // Intra refres:
    param.i_keyint_max = fps;
    param.b_intra_refresh = 1;
    //Rate control:
    param.rc.i_rc_method = X264_RC_CRF;
    param.rc.f_rf_constant = 25;
    param.rc.f_rf_constant_max = 35;
    //For streaming:
    param.b_repeat_headers = 1;
    param.b_annexb = 1;
    x264_param_apply_profile(&param, "baseline");
    

    I want to create wrapper for such.. thing. so I have libx264.dll and visual studio 2010 pro.

    How can I create .Net C# wrapper for it?

    I am a beginner in P\Invoke stuff so I do not get a lot of it...

    what I want to achive is is frame by frame level of working with x264... By now I need only encoding parts... And all needed sample code for doing it in C is in How does one encode a series of images into H264 using the x264 C API? . So I need to write a wrapper only for stuff mentioned there... So I am asking - how to create a wrapper on Parameter and on Function that sets up thap param. And I would love to see how to call that wrapper back from c#. So if you could provide any code in support I'd be glad to see it.

  • FFMPEG RTSP stream to MPEG4/H264 file using libx264

    4 décembre 2016, par Phi

    Heyo folks,

    I'm attempting to transcode/remux an RTSP stream in H264 format into a MPEG4 container, containing just the H264 video stream. Basically, webcam output into a MP4 container.

    I can get a poorly coded MP4 produced, using this code:

    // Variables here for demo
    AVFormatContext * video_file_output_format = nullptr;
    AVFormatContext * rtsp_format_context = nullptr;
    AVCodecContext * video_file_codec_context = nullptr;
    AVCodecContext * rtsp_vidstream_codec_context = nullptr;
    AVPacket packet = {0};
    AVStream * video_file_stream = nullptr;
    AVCodec * rtsp_decoder_codec = nullptr;
    int errorNum = 0, video_stream_index = 0;
    std::string outputMP4file = "D:\\somemp4file.mp4";
    
    // begin
    AVDictionary * opts = nullptr;
    av_dict_set(&opts, "rtsp_transport", "tcp", 0);
    
    if ((errorNum = avformat_open_input(&rtsp_format_context, uriANSI.c_str(), NULL, &opts)) < 0) {
        errOut << "Connection failed: avformat_open_input failed with error " << errorNum << ":\r\n" << ErrorRead(errorNum);
        TacticalAbort();
        return;
    }
    
    rtsp_format_context->max_analyze_duration = 50000;
    if ((errorNum = avformat_find_stream_info(rtsp_format_context, NULL)) < 0) {
        errOut << "Connection failed: avformat_find_stream_info failed with error " << errorNum << ":\r\n" << ErrorRead(errorNum);
        TacticalAbort();
        return;
    }
    
    video_stream_index = errorNum = av_find_best_stream(rtsp_format_context, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0);
    
    if (video_stream_index < 0) {
        errOut << "Connection in unexpected state; made a connection, but there was no video stream.\r\n"
            "Attempts to find a video stream resulted in error " << errorNum << ": " << ErrorRead(errorNum);
        TacticalAbort();
        return;
    }
    
    rtsp_vidstream_codec_context = rtsp_format_context->streams[video_stream_index]->codec;
    
    av_init_packet(&packet);
    
    if (!(video_file_output_format = av_guess_format(NULL, outputMP4file.c_str(),  NULL))) {
        TacticalAbort();
        throw std::exception("av_guess_format");
    }
    
    if (!(rtsp_decoder_codec = avcodec_find_decoder(rtsp_vidstream_codec_context->codec_id))) {
        errOut << "Connection failed: connected, but avcodec_find_decoder returned null.\r\n"
            "Couldn't find codec with an AV_CODEC_ID value of " << rtsp_vidstream_codec_context->codec_id << ".";
        TacticalAbort();
        return;
    }
    
    video_file_format_context = avformat_alloc_context();
    video_file_format_context->oformat = video_file_output_format;
    
    if (strcpy_s(video_file_format_context->filename, sizeof(video_file_format_context->filename), outputMP4file.c_str())) {
        errOut << "Couldn't open video file: strcpy_s failed with error " << errno << ".";
        std::string log = errOut.str();
        TacticalAbort();
        throw std::exception("strcpy_s");
    }
    
    if (!(video_file_encoder_codec = avcodec_find_encoder(video_file_output_format->video_codec))) {
        TacticalAbort();
        throw std::exception("avcodec_find_encoder");
    }
    
    // MARKER ONE
    
    if (!outputMP4file.empty() &&
        !(video_file_output_format->flags & AVFMT_NOFILE) &&
        (errorNum = avio_open2(&video_file_format_context->pb, outputMP4file.c_str(), AVIO_FLAG_WRITE, nullptr, &opts)) < 0) {
        errOut << "Couldn't open video file \"" << outputMP4file << "\" for writing : avio_open2 failed with error " << errorNum << ": " << ErrorRead(errorNum);
        TacticalAbort();
        return;
    }
    
    // Create stream in MP4 file
    if (!(video_file_stream = avformat_new_stream(video_file_format_context, video_file_encoder_codec))) {
        TacticalAbort();
        return;
    }
    
    AVCodecContext * video_file_codec_context = video_file_stream->codec;
    
    // MARKER TWO
    
    // error -22/-21 in avio_open2 if this is skipped
    if ((errorNum = avcodec_copy_context(video_file_codec_context, rtsp_vidstream_codec_context)) != 0) {
        TacticalAbort();
        throw std::exception("avcodec_copy_context");
    }
    
    //video_file_codec_context->codec_tag = 0;
    
    /*
    // MARKER 3 - is this not needed? Examples suggest not.
    if ((errorNum = avcodec_open2(video_file_codec_context, video_file_encoder_codec, &opts)) < 0)
    {
        errOut << "Couldn't open video file codec context: avcodec_open2 failed with error " << errorNum << ": " << ErrorRead(errorNum);
        std::string log = errOut.str();
        TacticalAbort();
        throw std::exception("avcodec_open2, video file");
    }*/
    
    //video_file_format_context->flags |= AVFMT_FLAG_GENPTS;
    if (video_file_format_context->oformat->flags & AVFMT_GLOBALHEADER)
    {
        video_file_codec_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
    }
    
    if ((errorNum = avformat_write_header(video_file_format_context, &opts)) < 0) {
        errOut << "Couldn't open video file: avformat_write_header failed with error " << errorNum << ":\r\n" << ErrorRead(errorNum);
        std::string log = errOut.str();
        TacticalAbort();
        return;
    }
    

    However, there are several issues:

    1. I can't pass any x264 options to the output file. The output H264 matches the input H264's profile/level - switching cameras to a different model switches H264 level.
    2. The timing of the output file is off, noticeably.
    3. The duration of the output file is off, massively. A few seconds of footage becomes hours, although playtime doesn't match. (FWIW, I'm using VLC to play them.)

    Passing x264 options

    If I manually increment PTS per packet, and set DTS equal to PTS, it plays too fast, ~2-3 seconds' worth of footage in one second playtime, and duration is hours long. The footage also blurs past several seconds, about 10 seconds' footage in a second.

    If I let FFMPEG decide (with or without GENPTS flag), the file has a variable frame rate (probably as expected), but it plays the whole file in an instant and has a long duration too (over forty hours for a few seconds). The duration isn't "real", as the file plays in an instant.

    At Marker One, I try to set the profile by passing options to avio_open2. The options are simply ignored by libx264. I've tried:

    av_dict_set(&opts, "vprofile", "main", 0);
    av_dict_set(&opts, "profile", "main", 0); // error, missing '('
    // FF_PROFILE_H264_MAIN equals 77, so I also tried
    av_dict_set(&opts, "vprofile", "77", 0); 
    av_dict_set(&opts, "profile", "77", 0);
    

    It does seem to read the profile setting, but it doesn't use them. At Marker Two, I tried to set it after the avio_open2, before avformat_write_header .

    // I tried all 4 av_dict_set from earlier, passing it to avformat_write_header.
    // None had any effect, they weren't consumed.
    av_opt_set(video_file_codec_context, "profile", "77", 0);
    av_opt_set(video_file_codec_context, "profile", "main", 0);
    video_file_codec_context->profile = FF_PROFILE_H264_MAIN;
    av_opt_set(video_file_codec_context->priv_data, "profile", "77", 0);
    av_opt_set(video_file_codec_context->priv_data, "profile", "main", 0);
    

    Messing with privdata made the program unstable, but I was trying anything at that point. I'd like to solve issue 1 with passing settings, since I imagine it'd bottleneck any attempt to solve issues 2 or 3.

    I've been fiddling with this for the better part of a month now. I've been through dozens of documentation, Q&As, examples. It doesn't help that quite a few are outdated.

    Any help would be appreciated.

    Cheers

  • ffpyplayer with libx264 error : cannot locate symbol "avio_seek" referenced by "player.so"

    2 décembre 2016, par Gerasimov Mikhail

    Kivy's ffpyplayer 3.2 can be built with python-for-android's old toolchain recipe. I also want ffpyplayer to open more video formats so I try to add libx264 for ffmpeg2 recipe.

    I created separate recipe for libx264, here's how I build lib:

    try ./configure \
      --cross-prefix=arm-linux-androideabi- \
      --sysroot="$NDKPLATFORM" \
      --host=arm-linux \
      --enable-pic \
      --disable-asm \
      --disable-cli \
      --disable-opencl \
      --enable-shared \
      --prefix=$BUILD_x264
    

    Here's main part where I add libx264 to ffmpeg2:

    debug "Activate flags for x264 / ffmpeg2"
    x264_CFLAGS="-I$BUILD_x264/include/"
    x264_LDFLAGS="-L$BUILD_x264/lib/ -Wl,-soname,libx264.so"
    

    Everything compiles fine, but I'm getting error when trying to use ffpyplayer on Android device:

    ffpyplayer - ImportError: dlopen failed: cannot locate symbol "avio_seek" referenced by "player.so"

    Any idea what can it be?

    I have no knowledges in compiling libs so I would be grateful if you suggest me way where to go to find reason of this error.