[FFmpeg-user] verifying losslessness after merging two mono tracks into single stereo track

Carl Eugen Hoyos ceffmpeg at gmail.com
Thu Sep 19 01:24:30 EEST 2019


Am Mi., 18. Sept. 2019 um 14:08 Uhr schrieb Kieran O'Leary
<kieran.oleary at irishfilm.ie>:
>
> I am very sorry  - Outlook Web App sent the email when I tried to copy paste the command - also it won't let me bottom post! i promise that future emails will be in the correct format.
>
> This is the command I used to do a one second test where the intention is to merge two mono audio tracks into one stereo track - i was hoping that there was a way to do this without a filter but i guess not?:
> ffmpeg -i "input.mov"  -filter_complex "
> [0:2][0:3]join=inputs=2:channel_layout=stereo[a]" -map "[a]"  -c:a pcm_s24le -c:
> v copy -t 1 output.mov
> ffmpeg version N-92623-g2c64a6bcd2 Copyright (c) 2000-2018 the FFmpeg developers
>
>   built with gcc 8.2.1 (Rev1, Built by MSYS2 project) 20181130
>   configuration:  --disable-autodetect --enable-amf --enable-bzlib --enable-cuda
>  --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-iconv --enable-lzma --e
> nable-nvenc --enable-zlib --enable-sdl2 --disable-debug --enable-ffnvcodec --ena
> ble-nvdec --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvp
> x --enable-libx264 --enable-libx265 --enable-libdav1d --enable-fontconfig --enab
> le-libass --enable-libbluray --enable-libfreetype --enable-libmfx --enable-libmy
> sofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg
> --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enabl
> e-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libwavpack --e
> nable-libwebp --enable-libxml2 --enable-libzimg --enable-libshine --enable-gpl -
> -enable-avisynth --enable-libxvid --enable-libaom --enable-version3 --enable-chr
> omaprint --enable-decklink --enable-frei0r --enable-libbs2b --enable-libcaca --e
> nable-libcdio --enable-libfdk-aac --enable-libflite --enable-libfribidi --enable
> -libgme --enable-libgsm --enable-libilbc --enable-libkvazaar --enable-libmodplug
>  --enable-libopenh264 --enable-libopenmpt --enable-librtmp --enable-librubberban
> d --enable-libssh --enable-libtesseract --enable-libxavs --enable-libzmq --enabl
> e-libzvbi --enable-opencl --enable-opengl --enable-libvmaf --enable-libcodec2 --
> enable-libsrt --enable-ladspa --enable-openssl --extra-cflags=-fopenmp --extra-l
> ibs=-lgomp --extra-cflags=-DLIBTWOLAME_STATIC --extra-libs=-lstdc++ --extra-cfla
> gs=-DLIBSSH_STATIC --extra-ldflags='-Wl,--allow-multiple-definition' --extra-cfl
> ags=-DCACA_STATIC --extra-cflags=-DMODPLUG_STATIC --extra-cflags=-DCHROMAPRINT_N
> ODLL --extra-libs=-lstdc++ --extra-cflags=-DZMQ_STATIC --extra-libs=-lpsapi --ex
> tra-cflags=-DLIBXML_STATIC --extra-libs=-liconv --disable-w32threads --extra-cfl
> ags=-DKVZ_STATIC_LIB --enable-nonfree
>   libavutil      56. 24.101 / 56. 24.101
>   libavcodec     58. 41.101 / 58. 41.101
>   libavformat    58. 23.102 / 58. 23.102
>   libavdevice    58.  6.101 / 58.  6.101
>   libavfilter     7. 46.101 /  7. 46.101
>   libswscale      5.  4.100 /  5.  4.100
>   libswresample   3.  4.100 /  3.  4.100
>   libpostproc    55.  4.100 / 55.  4.100
> Guessed Channel Layout for Input Stream #0.2 : mono
> Guessed Channel Layout for Input Stream #0.3 : mono
> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.mov':
>   Metadata:
>     creation_time   : 2019-09-18T09:27:36.000000Z
>   Duration: 01:37:57.56, start: 0.000000, bitrate: 223490 kb/s
>     Stream #0:0(eng): Video: v210 (v210 / 0x30313276), yuv422p10le(smpte170m/bt4
> 70bg/bt709, top coded first (swapped)), 720x576, 221184 kb/s, SAR 16:15 DAR 4:3,
>  25 fps, 25 tbr, 25k tbn, 25k tbc (default)
>     Metadata:
>       creation_time   : 2019-09-18T09:27:36.000000Z
>       handler_name    : Apple Video Media Handler
>       encoder         : 10 bit YCbCr
>       timecode        : 00:58:04:15
>     Stream #0:1(eng): Data: none (tmcd / 0x64636D74) (default)
>     Metadata:
>       creation_time   : 2019-09-18T09:27:36.000000Z
>       handler_name    : Time Code Media Handler
>       reel_name       : Untitled
>       timecode        : 00:58:04:15
>     Stream #0:2(eng): Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32
> (24 bit), 1152 kb/s (default)
>     Metadata:
>       creation_time   : 2019-09-18T09:27:36.000000Z
>       handler_name    : Apple Sound Media Handler
>     Stream #0:3(eng): Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32
> (24 bit), 1152 kb/s (default)
>     Metadata:
>       creation_time   : 2019-09-18T09:27:36.000000Z
>       handler_name    : Apple Sound Media Handler
> File 'output.mov' already exists. Overwrite ? [y/N] y
> Stream mapping:
>   Stream #0:2 (pcm_s24le) -> join:input0
>   Stream #0:3 (pcm_s24le) -> join:input1
>   join -> Stream #0:0 (pcm_s24le)
> Press [q] to stop, [?] for help
> Output #0, mov, to 'output.mov':
>   Metadata:
>     encoder         : Lavf58.23.102
>     Stream #0:0: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, stereo, s32, 23
> 04 kb/s (default)
>     Metadata:
>       encoder         : Lavc58.41.101 pcm_s24le
> size=     282kB time=00:00:01.00 bitrate=2309.9kbits/s speed=41.1x
> video:0kB audio:281kB subtitle:0kB other streams:0kB global headers:0kB muxing o
> verhead: 0.256944%
>
> What is the best way to verify that the process was lossless?
>
> I tried the following which seems very clumsy:
> 1. Export the two original audio tracks as seperate wav files with  (i know i could have done it in one command but I just knocked this together)
> ffmpeg -i input.mov -c:a copy -t 1 -map 0:2  left.wav
> ffmpeg -i input.mov -c:a copy -t 1 -map 0:3  right.wav
>
> 2. Export the new output.mov with the single stereo track as a WAV, then used the following to make seperate tracks out of the channels: with ffmpeg -i output.mov -c:a pcm_s24le -map_channel 0.0.0 left_merge.wav -c:a pcm_s24le -map_channel 0.0.1 right_merge.wav
>
> 3. Use framemd5s to compare the various wavs to make sure that the same samples are produced in the source and output.
>
> The framemd5s were indeed identical aside from the last sample, which may have had something to do with trimming at 1 second.
>
> is there an easier way to verify that the same audio is produced in the source  audio files as with the merged stereo track?

Once again you are trying to use FFmpeg to check FFmpeg, this may work
in special cases, it cannot work in the general case.
>From a quick look, the most likely part of FFmpeg to fail above is the
mov demuxer: Iiuc, you are using it both to create the samples and to
check their correctness - this is simply wrong.
(An example where it may work is when you can create a file that is
bit-identical with the original input file. But we have also discussed
in the past that this is unlikely due to the fact that FFmpeg - even
with lossless encoding - is not a tool for file archiving.)

I believe you can check your workflow with mplayer -demuxer mov
-dumpaudio -aid, most likely also with vlc and GStreamer, maybe even
with afconvert

Carl Eugen


More information about the ffmpeg-user mailing list