Newest 'libx264' Questions - Stack Overflow
Les articles publiés sur le site
-
how to trim video in h264 format using ffmpeg while preserving quality ?
16 décembre 2020, par prisonmike11I'm new to ffmpeg,
I'm trimming a small clip from a bluray H264 video by providing start and end duration.
I tried:
ffmpeg -ss 00:01:00 -i input.mp4 -to 00:02:00 -c copy output.mp4
but this results in stuttering issues in start of the video. The audio and video also don't match.
I tried using
-c libx264
but this is taking too long and the output video has much lower bit rate.My goal is to trim as fast as possible while preserving quality. I don't care about the frame accuracy of the trim. I plan on uploading the output to youtube.
what flags should I use?
-
Unknown decoder 'libx264'
29 octobre 2020, par Reboot_My_ComputerI have
ffmpeg
with libx264 enabled from BtbN for Windows 10. This is the command:ffmpeg -f gdigrab -c:v libx264 -framerate 30 -i title="FiveM" -f flv rtmp://MYSITE.COM/stream/MYSECRETKEY
Unfortunately I get this output:
Unknown decoder 'libx264'
-
Why i can't use libx264 with FFMPEG on windows ?
29 octobre 2020, par Reboot_My_ComputerHello there
I'm trying to build game launcher that will start streaming when game starts, for this i am using FFMPEG. It all works fine until i try to use libx264 as encoder.I have FFMPEG with libx264 compiled from https://github.com/BtbN/FFmpeg-Builds/releases. This is the command i am using for it :
ffmpeg -f gdigrab -c:v libx264 -framerate 30 -i title="FiveM" -f flv rtmp://MYSITE.COM/stream/MYSECRETKEY
Unfortunately i get this output: FFMPEG OUTPUT
You can clearly see in output picture that FFMPEG is compiled with libx264, please note that i'm doing this on Windows 10.
-
How do I force an IDR-frame using the x264 C API ?
28 octobre 2020, par KeithI am attempting to use an external bool signal to force the next encoded frame to be an IDR-frame using the x264 C API. I am using the "baseline" profile with the "ultrafast" and "zerolatency" presets. I tried to use the input pic settings prior to encoding, as in this code snippet, but this has not worked. My class Open() and Encode() methods are shown here. Any help will be appreciated.
int X264Encoder::Open(void) { if (_x264VideoEncoder != NULL) Close(); // Set up default parameters. if (x264_param_default_preset(&_param, _encoderSpeedPreset.c_str(), "zerolatency") < 0) // 0=success, -1=failed { _errStr = "X264Encoder::Open: Default parameter preset failed with " + _encoderSpeedPreset; return(0); } // Set non-default params. _param.i_bitdepth = 8; _param.i_csp = _colourSpaceMapping[_colourSpace]; // Input colour space if(!_param.i_csp) { _errStr = "X264Encoder::Open: Incompatible colour space " + to_string(_colourSpace); return(0); } _param.i_width = _width; _param.i_height = _height; _param.i_fps_num = _videoRateNumerator; _param.i_fps_den = _videoRateDenominator; _param.rc.i_bitrate = _avgBitsPerSecond / 1000; // bitrate units are in kbits/s _param.i_threads = 1; _param.b_vfr_input = 0; // VFR input. If 1, use timebase and timestamps for ratecontrol purposes. If 0, use fps only. _param.b_repeat_headers = 1; // Put SPS/PPS before each keyframe _param.b_annexb = 1; // If set, place start codes (4 bytes) before NAL units, otherwise place size (4 bytes) before NAL units. // Apply profile restrictions. if (x264_param_apply_profile(&_param, _profile.c_str()) < 0) // 0=success, -1=failed { _errStr = "X264Encoder::Open: Unable to set profile " + _profile; return(0); } // Initialise the encoder input pic buffer. if (x264_picture_alloc(&_picIn, _param.i_csp, _param.i_width, _param.i_height) < 0) { _errStr = "X264Encoder::Open: Unable to alloc input picture buffer"; return(0); } _inPicIsAllocated = true; // Instantiate the encoder. _x264VideoEncoder = x264_encoder_open(&_param); if (_x264VideoEncoder == NULL) { _errStr = "X264Encoder::Open: Unable to instantiate the encoder"; // Clean up before exit. x264_picture_clean(&_picIn); _inPicIsAllocated = false; return(0); }//end if !_x264VideoEncoder... // Frame counting for pts timestamps. _frameNum = 0; _lastPicType = 0; // IDR-frame d.clear(); return(1); }//end Open. int X264Encoder::Encode(void* pSrc, void* pCmp, void* codeParameter) { _encodedFrameSize = 0; // Validation house work. if(!Ready()) { _errStr = "X264Encoder::Encode: Not ready"; return(0); } if(!pSrc || !pCmp) { _errStr = "X264Encoder::Encode: Invalid function parameter list"; return(0); } // Load input image. if(_param.i_csp != X264_CSP_I420) // Can only process I420 input colour space. { _errStr = "X264Encoder::Encode: I420 colour space required"; return(0); } uint32_t lumSize = _width * _height; uint32_t chrSize = lumSize / 4; // Transfer the input source image into the x264 picture img structure. uint8_t* pImg = static_cast(pSrc); memcpy_s(_picIn.img.plane[0], lumSize, pImg, lumSize); pImg += lumSize; memcpy_s(_picIn.img.plane[1], chrSize, pImg, chrSize); pImg += chrSize; memcpy_s(_picIn.img.plane[2], chrSize, pImg, chrSize); // Encode single frame _picIn.i_pts = _frameNum; if (_idrFrameRequired) { _picIn.i_type = X264_TYPE_IDR; //... and clear the signal. _idrFrameRequired = false; }//end if _idrFrameRequired... else _picIn.i_type = X264_TYPE_AUTO; _encodedFrameSize = x264_encoder_encode(_x264VideoEncoder, &_nal, &_nalCnt, &_picIn, &_picOut); if (_encodedFrameSize > 0) { // Write the encoded stream to the output. uint8_t* pOut = static_cast(pCmp); memcpy_s(pOut, _encodedFrameSize, _nal->p_payload, _encodedFrameSize); }//end else if _encodedFrameSize... else { _errStr = "X264Encoder::Encode: Encode process failed"; return(0); } _lastPicType = 1; // Non-IDR if (_picOut.i_type == X264_TYPE_IDR) _lastPicType = 0; // IDR d.push_back({ _encodedFrameSize, _lastPicType }); _frameNum++; return(1); }//end Encode...
-
What ffmpeg arguments will approximate Zoom recording quality [closed]
25 octobre 2020, par Stan IvanovI've been recording screen sharing presentations using Quicktime on my Mac and it uses x264 format with ~60fps. The produced video file is with type MOV and around 2.2GB for 1 hour of presentation. I want to compress it using ffmpeg and I've been doing so using x264 as well. Here are my arguments:
ffmpeg -i '$inputFile' -vcodec "libx264" -crf 32 -vf 'scale=${width}:-2,fps=24' -c:a aac -b:a 128k -preset veryslow -profile:v high -tune stillimage -f mp4 '$outputFile'
I rescale my video to 1600px width to save on space and I also convert the recording to 24fps as I see no need to have the full ~60fps available. It's mostly static images as I talk over my screen. This results in about 100MB file using the
-profile:v high
argument. Otherwise it is around 160MB.On the other hand Zoom recording for much larger resolutions (4k etc) are around ~80MB per 1 hour. Does anyone know what options we can use to approximate this file size and quality? I know they are using lower quality audio which might explain some of the difference.
But if I increase the
-crf 32
argument it starts to degrade quality too much. I am not sure how Zoom achieves it's video quality with high resolutions such as 1080p and 4k with a file size of ~80MB while I can't match it using 1600px width.Edit: I had an idea that I probably don't need all 24 fps in a screen sharing of static content. So I reduced it to 5 fps and that seems to work well for my use case. I wonder if this is what Zoom does?