Split stream in equal chunks

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Split stream in equal chunks

Marian Klymov
I want to receive rtmp stream (using nginx-rtmp module), transcode it and
save it in chunks.
I would like to have splitting at specific times and to have all chunks
equal to 30.00 seconds (except first and last obviously). I've tried
playing with different parameters. segment_atclocktime looked like it
should do what I want but it creates chunks of different sizes. Originally
I thought that this is because of keyframes, but even with -g 1 it fails
sometimes.
My last try looks like this https://pastebin.com/raw/dYED4YXQ Is it
possible to do such thing with ffmpeg or do I need to implement some
heuristics with trying to resplit chunks outside?
_______________________________________________
ffmpeg-user mailing list
[hidden email]
https://ffmpeg.org/mailman/listinfo/ffmpeg-user

To unsubscribe, visit link above, or email
[hidden email] with subject "unsubscribe".
Reply | Threaded
Open this post in threaded view
|

Re: Split stream in equal chunks

Carl Eugen Hoyos-2
Am Do., 25. März 2021 um 08:03 Uhr schrieb Marian Klymov <[hidden email]>:
>
> I want to receive rtmp stream (using nginx-rtmp module), transcode
> it and save it in chunks.
> I would like to have splitting at specific times and to have all chunks
> equal to 30.00 seconds (except first and last obviously). I've tried
> playing with different parameters. segment_atclocktime looked like
> it should do what I want but it creates chunks of different sizes.

Either I misunderstand or this makes no sense:
You write that you want 30-second-chunks which is not unusual I
guess. With each real encoder (like x264), each 30-second-chunk
has a different size (in bytes). Then you write that you expect that
your chunks all have the same size.
You would that be possible?

Generally, when asking questions here, always post the command
line you used together with the complete, uncut console output in
your email, do not use external resources.

Carl Eugen
_______________________________________________
ffmpeg-user mailing list
[hidden email]
https://ffmpeg.org/mailman/listinfo/ffmpeg-user

To unsubscribe, visit link above, or email
[hidden email] with subject "unsubscribe".
Reply | Threaded
Open this post in threaded view
|

Re: Split stream in equal chunks

Marian Klymov
Sorry, I've copied a message from #ffmpeg IRC channel which suggested using
pastebin for ffmpeg commands. This is the command that was the closest to
what I want but still doesn't always work.

ffmpeg -i rtmp://localhost/live/$name -s 1920x1080 -codec:a aac -ar
48000 -ac 1 -codec:v libx264 -r 25 -g 1 -f stream_segment
-segment_time 30 -reset_timestamps 1 -segment_atclocktime 1 -strftime
1 /var/rec/high%H%M%S.ts;

Example of output files:
1) ffprobe C:\dev\records_test\high162001.ts
ffprobe version 4.3.2-2021-02-27-full_build-www.gyan.dev Copyright (c)
2007-2021 the FFmpeg developers
  built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static
--disable-w32threads --disable-autodetect --enable-fontconfig
--enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp
--enable-lzma --enable-libsnappy --enable-zlib --enable-libsrt
--enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray
--enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi
--enable-librav1e --enable-libwebp --enable-libx264 --enable-libx265
--enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx
--enable-libass --enable-frei0r --enable-libfreetype
--enable-libfribidi --enable-libvidstab --enable-libvmaf
--enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid
--enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va
--enable-dxva2 --enable-libmfx --enable-libcdio --enable-libgme
--enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb
--enable-libmp3lame --enable-libshine --enable-libtheora
--enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc
--enable-libgsm --enable-libopencore-amrnb --enable-libopus
--enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b
--enable-libflite --enable-libmysofa --enable-librubberband
--enable-libsoxr --enable-chromaprint
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, mpegts, from 'C:\dev\records_test\high162001.ts':
  Duration: 00:00:28.66, start: 1.400000, bitrate: 18837 kb/s
  Program 1
    Metadata:
      service_name    : Service01
      service_provider: FFmpeg
    Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B),
yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr,
90k tbn, 50 tbc
    Stream #0:1[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F),
48000 Hz, mono, fltp, 4 kb/s

This was the start of the stream, so it's ok to have it not 30.00 seconds
I'm omitting uninteresting lines for next paragraphs - only bitrate
and duration are different.

2) Input #0, mpegts, from 'C:\dev\records_test\high162029.ts':
  Duration: 00:00:30.04, start: 1.400000, bitrate: 17092 kb/s - 29 in
name for some reason. And also not 30.00.

3) 2 more chunks with 30.00
4) Input #0, mpegts, from 'C:\dev\records_test\high162200.ts':
  Duration: 00:00:29.96, start: 1.400000, bitrate: 16452 kb/s

I don't care about file size. I want to always have 30.00 seconds. Without
specifying -g 1 I'm usually getting 30.06-30.07 (this is what ffprobe shows
me).

I've also tried keyint=1 and force_key_frames expr:gte(t,n_forced*30)

I'm testing this inside a very simple Docker container based on Debian
Buster. ffmpeg is triggered by nginx if it matters at all.

# ffmpeg -version
ffmpeg version 4.1.6-1~deb10u1 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 8 (Debian 8.3.0-6)
configuration: --prefix=/usr --extra-version='1~deb10u1'
--toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu
--incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl
--disable-stripping --enable-avresample --disable-filter=resample
--enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom
--enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca
--enable-libcdio --enable-libcodec2 --enable-libflite
--enable-libfontconfig --enable-libfreetype --enable-libfribidi
--enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame
--enable-libmysofa --enable-libopenjpeg --enable-libopenmpt
--enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband
--enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex
--enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab
--enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp
--enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq
--enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl
--enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883
--enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil      56. 22.100 / 56. 22.100
libavcodec     58. 35.100 / 58. 35.100
libavformat    58. 20.100 / 58. 20.100
libavdevice    58.  5.100 / 58.  5.100
libavfilter     7. 40.101 /  7. 40.101
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  3.100 /  5.  3.100
libswresample   3.  3.100 /  3.  3.100
libpostproc    55.  3.100 / 55.  3.100

Best regards,
Marian Klymov

чт, 25 бер. 2021 о 11:28 Carl Eugen Hoyos <[hidden email]> пише:

> Am Do., 25. März 2021 um 08:03 Uhr schrieb Marian Klymov <
> [hidden email]>:
> >
> > I want to receive rtmp stream (using nginx-rtmp module), transcode
> > it and save it in chunks.
> > I would like to have splitting at specific times and to have all chunks
> > equal to 30.00 seconds (except first and last obviously). I've tried
> > playing with different parameters. segment_atclocktime looked like
> > it should do what I want but it creates chunks of different sizes.
>
> Either I misunderstand or this makes no sense:
> You write that you want 30-second-chunks which is not unusual I
> guess. With each real encoder (like x264), each 30-second-chunk
> has a different size (in bytes). Then you write that you expect that
> your chunks all have the same size.
> You would that be possible?
>
> Generally, when asking questions here, always post the command
> line you used together with the complete, uncut console output in
> your email, do not use external resources.
>
> Carl Eugen
> _______________________________________________
> ffmpeg-user mailing list
> [hidden email]
> https://ffmpeg.org/mailman/listinfo/ffmpeg-user
>
> To unsubscribe, visit link above, or email
> [hidden email] with subject "unsubscribe".
_______________________________________________
ffmpeg-user mailing list
[hidden email]
https://ffmpeg.org/mailman/listinfo/ffmpeg-user

To unsubscribe, visit link above, or email
[hidden email] with subject "unsubscribe".