0

I have a lot of videos recorded in OBS, and I want to output from ffmpeg such video, which will be compatible with those OBS videos for concat filter (lossless concatenation).

Encoding settings can be found in screenshots, fps=30, res=1440x900.

When ffmpeg-video is the first segment, it displayed properly, if it's after OBS-segment - then it is corrupted. OBS-segments are shown properly regardless of anything.

This is command I've tried to generate compatible video: (with pwsh here-string):

ffmpeg -hide_banner -filter_complex @"
color=c=green:s=1440x900:d=5[xv];
anullsrc=channel_layout=stereo:sample_rate=48000[xa];
[xv]drawtext=text='BLABLABLA':fontcolor=black:fontsize=64:x=(w-text_w)/2:y=(h-text_h)/2[xv];
"@ -map [xv] -map [xa] -c:v hevc_nvenc -preset slow -tune hq -multipass qres -profile:v main -rc cbr -b:v 2500k -c:a aac -r 30 -t 5 rendText.mkv

This is how I concatenate them:

ffmpeg -f concat -safe 0 -i delmeVids.txt -c copy -reset_timestamps 1 -force_key_frames "expr:gte(t,n_forced*1)" concat.mkv

This is output of ffprobe for OBS-video:

Input #0, matroska,webm, from 'OBS-video.mkv':
  Metadata:
    ENCODER         : Lavf60.3.100
  Duration: 00:03:14.40, start: 0.000000, bitrate: 2672 kb/s
  Stream #0:0: Video: hevc (Main), yuv420p(tv, bt709), 1440x900 [SAR 1:1 DAR 8:5], 30 fps, 30 tbr, 1k tbn
      Metadata:
        DURATION        : 00:03:14.400000000
  Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp
      Metadata:
        title           : Track1
        DURATION        : 00:03:14.282000000

for FFMPEG-video:

Input #0, matroska,webm, from 'FFMPEG-VIDEO.mkv':
  Metadata:
    ENCODER         : Lavf61.0.100
  Duration: 00:00:05.02, start: -0.021000, bitrate: 32 kb/s
  Stream #0:0: Video: hevc (Main), yuv420p(tv, progressive), 1440x900 [SAR 1:1 DAR 8:5], 30 fps, 30 tbr, 1k tbn
      Metadata:
        ENCODER         : Lavc61.1.101 hevc_nvenc
        DURATION        : 00:00:05.000000000
  Stream #0:1: Audio: aac (LC), 48000 Hz, stereo, fltp
      Metadata:
        ENCODER         : Lavc61.1.101 aac
        DURATION        : 00:00:05.021000000

hevc-nvenc args for reference:

Encoder hevc_nvenc [NVIDIA NVENC hevc encoder]:
    General capabilities: dr1 delay hardware 
    Threading capabilities: none
    Supported hardware devices: cuda cuda d3d11va d3d11va 
    Supported pixel formats: yuv420p nv12 p010le yuv444p p016le yuv444p16le bgr0 bgra rgb0 rgba x2rgb10le x2bgr10le gbrp gbrp16le cuda d3d11
hevc_nvenc AVOptions:
  -preset            <int>        E..V....... Set the encoding preset (from 0 to 18) (default p4)
     default         0            E..V....... 
     slow            1            E..V....... hq 2 passes
     medium          2            E..V....... hq 1 pass
     fast            3            E..V....... hp 1 pass
     hp              4            E..V....... 
     hq              5            E..V....... 
     bd              6            E..V....... 
     ll              7            E..V....... low latency
     llhq            8            E..V....... low latency hq
     llhp            9            E..V....... low latency hp
     lossless        10           E..V....... lossless
     losslesshp      11           E..V....... lossless hp
     p1              12           E..V....... fastest (lowest quality)
     p2              13           E..V....... faster (lower quality)
     p3              14           E..V....... fast (low quality)
     p4              15           E..V....... medium (default)
     p5              16           E..V....... slow (good quality)
     p6              17           E..V....... slower (better quality)
     p7              18           E..V....... slowest (best quality)
  -tune              <int>        E..V....... Set the encoding tuning info (from 1 to 5) (default hq)
     hq              1            E..V....... High quality
     uhq             5            E..V....... Ultra high quality
     ll              2            E..V....... Low latency
     ull             3            E..V....... Ultra low latency
     lossless        4            E..V....... Lossless
  -profile           <int>        E..V....... Set the encoding profile (from 0 to 4) (default main)
     main            0            E..V....... 
     main10          1            E..V....... 
     rext            2            E..V....... 
  -level             <int>        E..V....... Set the encoding level restriction (from 0 to 186) (default auto)
     auto            0            E..V....... 
     1               30           E..V....... 
     1.0             30           E..V....... 
     2               60           E..V....... 
     2.0             60           E..V....... 
     2.1             63           E..V....... 
     3               90           E..V....... 
     3.0             90           E..V....... 
     3.1             93           E..V....... 
     4               120          E..V....... 
     4.0             120          E..V....... 
     4.1             123          E..V....... 
     5               150          E..V....... 
     5.0             150          E..V....... 
     5.1             153          E..V....... 
     5.2             156          E..V....... 
     6               180          E..V....... 
     6.0             180          E..V....... 
     6.1             183          E..V....... 
     6.2             186          E..V....... 
  -tier              <int>        E..V....... Set the encoding tier (from 0 to 1) (default main)
     main            0            E..V....... 
     high            1            E..V....... 
  -rc                <int>        E..V....... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp         0            E..V....... Constant QP mode
     vbr             1            E..V....... Variable bitrate mode
     cbr             2            E..V....... Constant bitrate mode
     vbr_minqp       8388609      E..V....... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality 8388609      E..V....... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size   8388610      E..V....... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass       8388609      E..V....... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq       8388610      E..V....... Constant bitrate low delay high quality mode
     cbr_hq          8388610      E..V....... Constant bitrate high quality mode
     vbr_hq          8388609      E..V....... Variable bitrate high quality mode
  -rc-lookahead      <int>        E..V....... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces          <int>        E..V....... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr               <boolean>    E..V....... Use cbr encoding mode (default false)
  -2pass             <boolean>    E..V....... Use 2pass encoding mode (default auto)
  -gpu               <int>        E..V....... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
     any             -1           E..V....... Pick the first device available
     list            -2           E..V....... List the available devices
  -rgb_mode          <int>        E..V....... Configure how nvenc handles packed RGB input. (from 0 to INT_MAX) (default yuv420)
     yuv420          1            E..V....... Convert to yuv420
     yuv444          2            E..V....... Convert to yuv444
     disabled        0            E..V....... Disables support, throws an error.
  -delay             <int>        E..V....... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut       <boolean>    E..V....... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr        <boolean>    E..V....... If forcing keyframes, force them as IDR frames. (default false)
  -spatial_aq        <boolean>    E..V....... set to 1 to enable Spatial AQ (default false)
  -spatial-aq        <boolean>    E..V....... set to 1 to enable Spatial AQ (default false)
  -temporal_aq       <boolean>    E..V....... set to 1 to enable Temporal AQ (default false)
  -temporal-aq       <boolean>    E..V....... set to 1 to enable Temporal AQ (default false)
  -zerolatency       <boolean>    E..V....... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p          <boolean>    E..V....... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop        <boolean>    E..V....... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength       <int>        E..V....... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
  -cq                <float>      E..V....... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
  -aud               <boolean>    E..V....... Use access unit delimiters (default false)
  -bluray-compat     <boolean>    E..V....... Bluray compatibility workarounds (default false)
  -init_qpP          <int>        E..V....... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB          <int>        E..V....... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI          <int>        E..V....... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                <int>        E..V....... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -qp_cb_offset      <int>        E..V....... Quantization parameter offset for cb channel (from -12 to 12) (default 0)
  -qp_cr_offset      <int>        E..V....... Quantization parameter offset for cr channel (from -12 to 12) (default 0)
  -weighted_pred     <int>        E..V....... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
  -b_ref_mode        <int>        E..V....... Use B frames as references (from -1 to 2) (default -1)
     disabled        0            E..V....... B frames will not be used for reference
     each            1            E..V....... Each B frame will be used for reference
     middle          2            E..V....... Only (number of B frames)/2 will be used for reference
  -a53cc             <boolean>    E..V....... Use A53 Closed Captions (if available) (default true)
  -s12m_tc           <boolean>    E..V....... Use timecode (if available) (default true)
  -dpb_size          <int>        E..V....... Specifies the DPB size used for encoding (0 means automatic) (from 0 to INT_MAX) (default 0)
  -multipass         <int>        E..V....... Set the multipass encoding (from 0 to 2) (default disabled)
     disabled        0            E..V....... Single Pass
     qres            1            E..V....... Two Pass encoding is enabled where first Pass is quarter resolution
     fullres         2            E..V....... Two Pass encoding is enabled where first Pass is full resolution
  -ldkfs             <int>        E..V....... Low delay key frame scale; Specifies the Scene Change frame size increase allowed in case of single frame VBV and CBR (from 0 to 255) (default 0)
  -extra_sei         <boolean>    E..V....... Pass on extra SEI data (e.g. a53 cc) to be included in the bitstream (default true)
  -udu_sei           <boolean>    E..V....... Pass on user data unregistered SEI if available (default false)
  -intra-refresh     <boolean>    E..V....... Use Periodic Intra Refresh instead of IDR frames (default false)
  -single-slice-intra-refresh <boolean>    E..V....... Use single slice intra refresh (default false)
  -max_slice_size    <int>        E..V....... Maximum encoded slice size in bytes (from 0 to INT_MAX) (default 0)
  -constrained-encoding <boolean>    E..V....... Enable constrainedFrame encoding where each slice in the constrained picture is independent of other slices (default false)
  -tf_level          <int>        E..V....... Specifies the strength of the temporal filtering (from -1 to INT_MAX) (default -1)
     0               0            E..V....... 
     4               4            E..V....... 
  -lookahead_level   <int>        E..V....... Specifies the lookahead level. Higher level may improve quality at the expense of performance. (from -1 to 15) (default -1)
     auto            15           E..V....... 
     0               0            E..V....... 
     1               1            E..V....... 
     2               2            E..V....... 
     3               3            E..V....... 
  -unidir_b          <boolean>    E..V....... Enable use of unidirectional B-Frames. (default false)
  -split_encode_mode <int>        E..V....... Specifies the split encoding mode (from 0 to 15) (default auto)
     disabled        15           E..V....... Disabled for all configurations
     auto            0            E..V....... Enabled or disabled depending on the preset and tuning info
     forced          1            E..V....... Enabled with number of horizontal strips selected by the driver
     2               2            E..V....... Enabled with number of horizontal strips forced to 2 when number of NVENCs > 1
     3               3            E..V....... Enabled with number of horizontal strips forced to 3 when number of NVENCs > 2

obs 1

obs 2

Giacomo1968
  • 58,727

1 Answers1

0

I've failed to generate such video which will be compatible with those already captured with OBS, but below there are combinations which make videos compatible for lossless concatenation.

Concatenate files like this: ffmpeg -f concat -safe 0 -i delmeVids.txt -c copy concat.mkv.

Standard

OBS Screenshot

Ffmpeg command which generates compatible video:

ffmpeg -hide_banner -filter_complex @"
color=c=green:s=2560x1600:d=5, fps=30[xv];
anullsrc=channel_layout=stereo:sample_rate=48000[xa];
[xv]drawtext=text='BLABLABLA':fontcolor=black:fontsize=64:x=(w-text_w)/2:y=(h-text_h)/2[xv];
"@ -map [xv] -map [xa] -c:v hevc_nvenc -preset p5 -tune hq -b:v 2500k -bf 0 -c:a aac -aspect 2560:1600 -t 5 rendText_p5hq.mkv

Custom Output (FFMmpeg)

With Type=Custom Output (FFMmpeg) you can't pause while recording. You'd better stick with Type=Standard.

OBS settings: OBS screenshot

FFMPEG generate video command:


ffmpeg -hide_banner -filter_complex @"
color=c=green:s=2560x1600:d=5[xv];
anullsrc=channel_layout=stereo:sample_rate=48000[xa];
[xv]drawtext=text='BLABLABLA':fontcolor=black:fontsize=64:x=(w-text_w)/2:y=(h-text_h)/2[xv];
"@ -map [xv] -map [xa] -c:v hevc_nvenc -preset fast -profile:v main -b:v 2500k -r 30 -ab 128k -t 5 rendText.mov

Draw text on some video

Actually, I was trying to draw text not on a green background, but on top of another video. Some background videos have been creating new compatibility issues, so below is kinda universal command (with pwsh syntax).

ffmpeg -hide_banner -filter_complex @"
movie=C\\:/Users/vid.mov, fps=30, scale=2560:1600:flags=lanczos[xv];
anullsrc=channel_layout=stereo:sample_rate=48000[xa];
[xv]drawtext=text='BLABLABLA':fontcolor=black:fontsize=60:box=1:boxborderw=40:boxcolor=white@0.5:x=(w-text_w)/2:y=(h-text_h)/2[xv];
"@ -map [xv] -map [xa] -c:v hevc_nvenc -preset p5 -tune hq -b:v 2500k -bf 0 -c:a aac -aspect 2560:1600 -pix_fmt yuv420p -t 5 renderedText.mkv