Hi everyone

I am transcoding larger videos on a set of computers in parallel. I do this by 
segmenting an input file at key-frames (ffmpeg -i ... -f segment), then 
transcode parts using GNU parallel, then recombine parts into one output file 
using ffmpeg -f concat -i ...). This works well, but I had issues with audio 
being not in sync with videos or having audio "artefacts". I solved that by 
transcoding audio separately, but I would prefer the more direct solution to 
transcode both audio and video in one step.

If segmented video parts are concat together I sometimes experience audio 
"artefacts" (audio discontinues and then starts again) and I can't find a way 
to avoid it. I would very much like some insights from your side why this 
happens or how this artefacts can be avoided. I could not find any solution 
using aresample filter, async, vsync, forcing constant frame rate.

I prepared a simple working example (all files stored in /tmp; I increased 
I-Frames in the input file so that audio artefacts are getting more 
pronounced). I also included ffprobe of the input and output-file after the 
example, maybe you already see a problem there without executing this example 
(I might just don't see the trees in the forest anymore...).

############

# generated Output file is at http://www.pentachoron.net/output.mov, if you 
only want to hear/see the result

# step 1: download example file, input.avi

cd /tmp && wget http://www.pentachoron.net/input.avi

# step 2: create segments

ffmpeg -y -hide_banner -i /tmp/input.avi -f segment -segment_time 0.5 
-reset_timestamps 1 -segment_list /tmp/input_part.list -segment_list_type 
ffconcat -r 25 -c:v copy -c:a copy -strict experimental -c:s copy -map v? -map 
a? -map s? /tmp/input_part_%06d.mp4

# step 3: process each "segment" (parts created in step 2)

for f in `seq -f %06g 1 59`; do ffmpeg -y -hide_banner -i input_part_$f.mp4 
-c:v libx265 -map v? -map a? -map s? /tmp/output_part_$f.mp4; done

# step 4: create a ffconcat file for the output file

for f in /tmp/output_part_*.mp4; do echo "file '$f'" >>/tmp/output_part.list; 
done

# step 5: create output file

ffmpeg -y -hide_banner -safe 0 -f concat -i /tmp/output_part.list -c:v copy 
-c:a copy -c:s copy -map v? -map a? -map s? /tmp/output.mov

############

ffprobe of the input file:

user@sonne:/tmp$ ffprobe input.avi
ffprobe version 4.1.3 Copyright (c) 2007-2019 the FFmpeg developers
  built with gcc 8 (Debian 8.3.0-4)
  configuration: --disable-decoder=amrnb --disable-decoder=libopenjpeg 
--disable-libopencv --disable-outdev=sdl2 --disable-podpages --disable-sndio 
--disable-stripping --enable-libaom --enable-avfilter --enable-avresample 
--enable-gcrypt --enable-gnutls --enable-gpl --enable-libass --enable-libbluray 
--enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 
--enable-libfdk-aac --enable-libfontconfig --enable-libfreetype 
--enable-libfribidi --enable-libgme --enable-libgsm --enable-libilbc 
--enable-libkvazaar --enable-libmp3lame --enable-libopencore-amrnb 
--enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg 
--enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband 
--enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex 
--enable-libtesseract --enable-libtheora --enable-libvidstab 
--enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx265 
--enable-libxvid --enable-libzvbi --enable-nonfree --enable-opencl 
--enable-opengl --enable-postproc --enable-pthreads --enable-shared 
--enable-version3 --enable-libwebp --incdir=/usr/include/x86_64-linux-gnu 
--libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --toolchain=hardened 
--enable-frei0r --enable-chromaprint --enable-libx264 --enable-libiec61883 
--enable-libdc1394 --enable-vaapi --enable-libmfx --disable-altivec 
--shlibdir=/usr/lib/x86_64-linux-gnu
  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
Input #0, avi, from 'input.avi':
  Metadata:
    IAS1            : Deutsch
    IAS2            : English
    encoder         : Lavf58.20.100
  Duration: 00:00:30.04, start: 0.000000, bitrate: 861 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (xvid / 0x64697678), yuv420p, 
576x432 [SAR 1:1 DAR 4:3], 719 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 48000 Hz, stereo, fltp, 128 
kb/s

ffprobe of the output file:

user@sonne:/tmp$ ffprobe output.mov
ffprobe version 4.1.3 Copyright (c) 2007-2019 the FFmpeg developers
  built with gcc 8 (Debian 8.3.0-4)
  configuration: --disable-decoder=amrnb --disable-decoder=libopenjpeg 
--disable-libopencv --disable-outdev=sdl2 --disable-podpages --disable-sndio 
--disable-stripping --enable-libaom --enable-avfilter --enable-avresample 
--enable-gcrypt --enable-gnutls --enable-gpl --enable-libass --enable-libbluray 
--enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 
--enable-libfdk-aac --enable-libfontconfig --enable-libfreetype 
--enable-libfribidi --enable-libgme --enable-libgsm --enable-libilbc 
--enable-libkvazaar --enable-libmp3lame --enable-libopencore-amrnb 
--enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg 
--enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband 
--enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex 
--enable-libtesseract --enable-libtheora --enable-libvidstab 
--enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx265 
--enable-libxvid --enable-libzvbi --enable-nonfree --enable-opencl 
--enable-opengl --enable-postproc --enable-pthreads --enable-shared 
--enable-version3 --enable-libwebp --incdir=/usr/include/x86_64-linux-gnu 
--libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --toolchain=hardened 
--enable-frei0r --enable-chromaprint --enable-libx264 --enable-libiec61883 
--enable-libdc1394 --enable-vaapi --enable-libmfx --disable-altivec 
--shlibdir=/usr/lib/x86_64-linux-gnu
  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
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mov':
  Metadata:
    major_brand     : qt
    minor_version   : 512
    compatible_brands: qt
    encoder         : Lavf58.20.100
  Duration: 00:01:01.25, start: 0.000000, bitrate: 342 kb/s
    Stream #0:0(eng): Video: hevc (Main) (hev1 / 0x31766568), yuv420p(tv, 
progressive), 576x432 [SAR 1:1 DAR 4:3], 172 kb/s, 23.94 fps, 50 tbr, 12800 
tbn, 25 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, 
fltp, 162 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

if you would execute the steps 1-5 above and watch /tmp/output.mov you'll 
notice that the sound "clacks" (stops and then starts again). Do you have an 
explanation or do you know how this audio artefacts can be solved? Can it be 
that it's just an issue with codec timebases or because libx265 is using a 
variable frame rate (ffprobe of output.mov has an effective fps of 23.94 while 
input.avi has a constant frame rate of 25 fps)? I would very much appreciate 
some help.

Thank you,

Philipp
_______________________________________________
ffmpeg-user mailing list
[email protected]
https://ffmpeg.org/mailman/listinfo/ffmpeg-user

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

Reply via email to