qx// only captures the command's STDOUT, to get STDERR, you'd have to use the redirection you showed, although whether that works will be dependent on the exact system you're running on - see The problem of "the" default shell.
print qx(ffmpg -f s16le -i out.raw 2>&1); does not capture the output of the ffmpeg-command.
Unfortunately I can't reproduce that, qx/ffmpeg ... 2>&1/ works for me on my Linux system. You'll have to be more specific about what system you're on, what version of Perl, version of ffmpeg, etc.
I am aware that there are other ways to capture stderr
Unless this is a script where you're certain it will only be run on one machine and it doesn't need to be portable, I really, strongly recommend to use one of those alternative ways. I wrote about them here (in short, IPC::Run3 for short-lived subprocesses, and IPC::Run for longer-running ones, in case you need to interact with them, run them in the background, etc.).