Newest 'x264' Questions - Stack Overflow

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

Les articles publiés sur le site

  • Use OpenH264 instead of libx264 in ffmpeg ?

    26 août 2020, par MING

    I use node-fluent-ffmpeg module to call ffmpeg.exe in my node.js app

    How to use OpenH264 when calling ffmpeg.exe?

    Do I need to recompile ffmpeg?

    But compiling ffmpeg looks complicated...

    The actual code is probably like this

    var FfmpegCommand = require('fluent-ffmpeg');
    var FFMPEG_PATH = "C:/ffmpeg/bin/ffmpeg.exe" // binary file
    FfmpegCommand.setFfmpegPath(FFMPEG_PATH)
    
    FfmpegCommand("dog.webm", {})
        .videoCodec('libx264')
        // command line 
        // .addOutputOption([
        //     '-threads 8'
        // ])
        .on('start', function (commandLine) {
            // Actual ffmpeg command
            // ffmpeg -i C:\Users\ming\Pictures\WEBCAMCAPTURE\dog.webm -y -vcodec libx264 C:\Users\ming\Pictures\WEBCAMCAPTURE\dog_x264.mp4
            console.log('command' + commandLine)
        })
        .on('progress', function (progress) {
            console.log('Processing: ' + progress.percent + '% done')
        })
        .on('end', function () {
            console.log('Finished')
        })
        .save("dog_x264.mp4")
    
    

    English isn’t my first language, so please excuse any mistakes.

  • compile ffmpeg with x264

    29 juillet 2020, par y2kbug

    I need ffmpeg with hardware acceleration. I am compiling ffmpeg following this guide: https://gist.github.com/Brainiarc7/eb45d2e22afec7534f4a117d15fe6d89

    x264 never works after compile. I follow the official guide, adding "--enable-shared", compile again, still no luck. https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

    Simply installing libx264-dev does not work as well.

    $ ldd ~/bin/ffmpeg | grep x264 libx264.so.155 => not found

    Does anyone know how to make x264 work? Thanks.

  • how to optimize x264 for online live education scene?

    21 juillet 2020, par Longshan DU

    I am working on a x264 optimization project for online live education. Often, the teachers are sitting before the camera, and doesn't have big motion, and the background are the same (exception light changes). And is there some papers that I can refer to that can reduce the bit rate or improve the video quality?

  • x264 output video is blank when threading is enabled

    15 juillet 2020, par NewbieCoder

    I am using libx264 compiled from source. It was configured to get both .dll and .lib by this command

    ./configure --disable-cli --enable-shared --extra-ldflags=-Wl,--output-def=libx264.def`

    I am using the libx264 API in my screen-sharing program with the preset - "veryfast", tune - "zerolatency", profile - "high" and also the following settings.

            param.i_csp = X264_CSP_BGRA;
            param.i_threads = 1;
            param.i_width = width;
            param.i_height = height;
            param.i_fps_num = fps;
            param.i_fps_den = 1;
            param.rc.i_bitrate = bitrate;
            param.rc.i_rc_method = X264_RC_ABR;
            param.rc.b_filler = true;
            param.rc.f_rf_constant = (float)0;
            param.rc.i_vbv_max_bitrate = param.rc.i_bitrate;
            param.rc.i_vbv_buffer_size = param.rc.i_bitrate;
            param.b_repeat_headers = 0;
            param.b_annexb = 1;
    

    For these settings the program works fine. I specified it as single threaded by setting param.i_threads = 1. If this is removed, x264 defaults to using multiple threads and sets param.i_threads as 1.5x of number of cores in the CPU automatically. This will give faster performance than running in single thread.

    But when I remove the param.i_threads = 1 to make it multi-threaded, the generated output is fully grey. I cannot see any output when I view the live stream with VLC or some times I can view a weird output.

    I am using this bitmap image as an example (https://imgur.com/a/l8LCd1l). Only this same image is being encoded multiple times. When it is saved into .h264 video, it is viewable clearly. But when the encoded payload is sent through rtmp, the live stream produces very bad and weird output (or sometimes no output). This is the weird output which im seeing most of the time for this image: https://imgur.com/a/VdyX1Zm

    This is the full example code in which I am both streaming and writing video file of the same picture. This is using the srs librtmp library. There is no error but the stream has weird output.

    In this code if you set add param.i_threads = 1; then only the output stream will be viewable. The problem is that it should be viewable in both single-threaded and multi-threaded encoding.

    #include 
    #include 
    #include 
    #include 
    #include "srs_librtmp.h"
    
    #pragma comment(lib, "C:/Softwares/x264/libx264.lib")
    
    using namespace std;
    
    int check_ret(int ret);
    
    int main()
    {
        int dts = 0;
    
        x264_param_t param;
        x264_t* h;
        x264_nal_t* nals;
        int i_nal;
        int pts = 0;
        int i_frame_size;
        x264_picture_t picIn;
        x264_picture_t picOut;
    
        x264_param_default_preset(&param, "veryfast", "zerolatency");
    
        //x264 settings
        param.i_csp = X264_CSP_BGRA;
        param.i_width = 1920;
        param.i_height = 1080;
        param.i_fps_num = 30;
        param.i_fps_den = 1;
        param.rc.i_bitrate = 2500;
        param.rc.i_rc_method = X264_RC_ABR;
        param.rc.b_filler = true;
        param.rc.f_rf_constant = (float)0;
        param.rc.i_vbv_max_bitrate = param.rc.i_bitrate;
        param.rc.i_vbv_buffer_size = param.rc.i_bitrate;
        param.b_repeat_headers = 0;
        param.b_annexb = 1;
    
        x264_param_apply_profile(&param, "high");
        h = x264_encoder_open(&param);
    
        //allocate picture
        x264_picture_alloc(&picIn, param.i_csp, param.i_width, param.i_height);
    
        //picture settings
        picIn.img.i_plane = 1;
        picIn.img.i_stride[0] = 4 * param.i_width;
        picIn.i_type = X264_TYPE_AUTO;
    
        int header_size = x264_encoder_headers(h, &nals, &i_nal);
        FILE* fptr;
        fopen_s(&fptr, "example1.h264", "wb");
        // write sps and pps in the video file
        fwrite(nals->p_payload, header_size, 1, fptr);
    
        int size = 1920 * 1080 * 4;
        char* bmp = new char[size];
        FILE* bitptr;
        errno_t err = fopen_s(&bitptr, "flower.bmp", "rb");
        fseek(bitptr, 54, SEEK_SET);
        fread(bmp, size, 1, bitptr);
        fclose(bitptr);
    
        srs_rtmp_t rtmp = srs_rtmp_create("127.0.0.1:1935/live/test");
    
        if (srs_rtmp_handshake(rtmp) != 0)
        {
            std::cout << "Simple handshake failed.";
            return -1;
        }
    
        std::cout << "Handshake completed successfully.\n";
    
        if (srs_rtmp_connect_app(rtmp) != 0) {
            std::cout << "Connecting to host failed.";
            return -1;
        }
    
        std::cout << "Connected to host successfully.\n";
    
        if (srs_rtmp_publish_stream(rtmp) != 0) {
            std::cout << "Publish signal failed.";
        }
    
        std::cout << "Publish signal success\n";
    
        // write sps and pps in the live stream
        int ret = srs_h264_write_raw_frames(rtmp, reinterpret_cast(nals->p_payload), header_size, 0, 0);
        ret = check_ret(ret);
        if (!ret)
            return -1;
        std::cout << "SPS and PPS sent.\n";
    
        // main loop
        std::cout << "Now streaming and encoding\n";
        int i = 1800;
        while (i--)
        {
    
            picIn.img.plane[0] = reinterpret_cast(bmp);
            picIn.i_pts = pts++;
            i_frame_size = x264_encoder_encode(h, &nals, &i_nal, &picIn, &picOut);
            if (i_frame_size)
            {
                for (int j = 0; j < i_nal; j++)
                {
    
                    x264_nal_t* nal = nals + j;
                    // write data in the video file
                    fwrite(nal->p_payload, nal->i_payload, 1, fptr);
                    // write data in the live stream
                    ret = srs_h264_write_raw_frames(rtmp, reinterpret_cast(nal->p_payload), nal->i_payload, dts, dts);
                    ret = check_ret(ret);
                    if (!ret)
                    {
                        return -1;
                    }
                }
            }
            else
            {
                std::cout << "i_frame_size = 0 (encoder failed)\n";
            }
            dts += 33;
        }
    
        while (x264_encoder_delayed_frames(h))
        {
            i_frame_size = x264_encoder_encode(h, &nals, &i_nal, NULL, &picOut);
            if (i_frame_size)
            {
                fwrite(nals->p_payload, i_frame_size, 1, fptr);
            }
        }
    
        std::cout << "\nAll done\n";
        std::cout << "Output video is example1.h264 and it is viewable in VLC";
    
        return 0;
    }
    
    int check_ret(int ret)
    {
        if (ret != 0) {
            if (srs_h264_is_dvbsp_error(ret)) {
                srs_human_trace("ignoring drop video error, code=%d", ret);
            }
            else if (srs_h264_is_duplicated_sps_error(ret)) {
                srs_human_trace("ignoring duplicated sps, code=%d", ret);
            }
            else if (srs_h264_is_duplicated_pps_error(ret)) {
                srs_human_trace("ignoring duplicated pps, code=%d", ret);
            }
            else {
                srs_human_trace("sending h264 raw data failed. ret=%d", ret);
                return 0;
            }
        }
        return 1;
    }
    

    If you would like to download the original flower.bmp file, here is the link: https://gofile.io/d/w2kX56 This error can be reproduced in any other bmp file also.

    Please tell me what is causing this problem when multi-threading is enabled. Am I setting wrong values? Is the code in which I am streaming the encoded data wrong?

  • Better way to use ffmpeg with vidstab and encoding 2 pass

    17 juin 2020, par Guillaume B.

    I scan old 8mm films so I have folder with set of jpeg

    I transform them to films using ffmpeg ( I choose x264 2 pass encoding)

    //On all folder that start by 1 I launch the pass1 for x264
    
    for f in 1*/ ; do cd "$f"; ffmpeg -y -r 18 -i img%05d.jpg -c:v libx264 -s 1200x898 -b:v 3000k -pass 1 -an -f mp4 /dev/null; cd ..; done
    
    //On all folder that start by 1 I launch the pass2 x264
    
    for f in 1*/ ; do cd "$f"; ffmpeg -y -r 18 -i img%05d.jpg -c:v libx264 -s 1200x898 -b:v 3000k -pass 2 ../"`echo ${PWD##*/}`.mp4"; cd ..; done
    

    --> Before I have set of folder with jpeg

    1965-FamilyStuff01\img1111.jpg,..,img9999.jpg

    1965-FamilyStuff02\img1111.jpg,..,img9999.jpg

    and I get

    1965-FamilyStuff01.mp4

    1965-FamilyStuff02.mp4

    then I discover vidstab that also need 2 pass

    // Stabilize every Video of a folder

    mkdir stab;for f in ./*.mp4 ; do echo "Stabilize $f" ; 
    ffmpeg -i "$f" -vf vidstabdetect=shakiness=5:accuracy=15:stepsize=6:mincontrast=0.3:show=2 -y -f mp4 /dev/null; 
    ffmpeg -i "$f" -vf vidstabtransform=smoothing=30:input="transforms.trf":interpol=linear:crop=black:zoom=0:optzoom=1,unsharp=5:5:0.8:3:3:0.4 -y "stab/$f" 
    ; done; rm transforms.trf;
    

    But I ask myself, that perhaps the order is not correct or perhaps there is a way to do the encoding with vidstab in less than 4 pass (2 pass for x264 encoding then 2 pass for vidstab) or perhaps the order should be change to optimize quality of film output)