0

i need to upload audio files (mainly WAV/FLAC) to an API. I validate these files by checking the output of ffprobe. I have a media file at hand that seemingly fulfills all requirements of the API (Sample rate, bitrate, etc.) but has one anomaly that probably causes the rejection. (It plays fine though) The file looks like this:

$ ffprobe sample.flac 
ffprobe version 4.2.4-1ubuntu0.1 Copyright (c) 2007-2020 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.3.0-10ubuntu2)
  configuration: --prefix=/usr --extra-version=1ubuntu0.1 --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-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, flac, from 'sample.flac':
  Metadata:
    ENCODER         : Easy CD-DA Extractor (http://www.poikosoft.com)
  Duration: 00:04:42.31, start: 0.000000, bitrate: 572 kb/s
    Stream #0:0: Audio: flac, 44100 Hz, stereo, s16

Notice that the Metadata states, that the encoder is Easy CD-DA Extractor (http://www.poikosoft.com), however, running ffmpeg -i sample.flac -map_metadata -1 -c:a copy sample-out.flac and running ffprobe again, the actual encoder turns out to be Lavf58.29.100.

$ ffprobe sample-out.flac
ffprobe version 4.2.4-1ubuntu0.1 Copyright (c) 2007-2020 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.3.0-10ubuntu2)
  configuration: --prefix=/usr --extra-version=1ubuntu0.1 --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-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Input #0, flac, from 'sample-out.flac':
  Metadata:
    encoder         : Lavf58.29.100
  Duration: 00:04:42.31, start: 0.000000, bitrate: 572 kb/s
    Stream #0:0: Audio: flac, 44100 Hz, stereo, s16

Now obviously, this is caused by this weird converter software, that encodes these files and puts the wrong encoder in the file's metadata. Now I have some questions:

  • Is this a required specification of flac files to include the encoder in the file metadata? Because the API documentation does not state anywhere if the metadata encoder has to match the actual encoder of the audio stream or what codecs are actually allowed.
  • How do I go about detecting such anomalies? Because currently, I have to copy the file with ffmpeg, check the encoder of the copied file. This process takes unnecessary compute resources.

Best regards, Florian

  • The "encoder" value is just a string and doesn't even have to be present at all. It should not matter what the value is. – greg-449 Apr 25 '22 at 13:44
  • 1
    Assuming things has not changed, see [this bug tracker item](https://trac.ffmpeg.org/ticket/6602) and [a post here](https://stackoverflow.com/questions/22120041/prevent-libavformat-ffmpeg-from-adding-encoder-tag-to-output-help-strippin). tl;dr, `ENCODER` metadata is protected and force set by ffmpeg. You can try `-fflags +bitexact` option to see if it works for flac. – kesh Apr 25 '22 at 14:18
  • Thanks for your replies. I will try to investigate why the API rejects these files. If that does not lead to any results, I will probably copy-convert all of the files via ffmpeg to make sure they have the correct encoder tag if the investigation does not lead to any results. This is what I could suggest to do if someone has has similar issue. – Florian Saurwein Apr 26 '22 at 14:04

1 Answers1

0

If you want to verify the integrity of a FLAC file, you can do that with the flac tool. It is packaged with most Linux distributions, is on Homebrew for MacOS and there are binaries for Windows.

If you run flac -t somefile.flac or flac -t somedirectory/*.flac it will tell you about the integrity of the files.

ktmf
  • 378
  • 1
  • 2
  • 8