Why are .so packages provided by the devel packages?

Software from the distribution is mechanically linked consistently, and expects to find libavcodec.so.54, so the unversioned name isn't required for any of the pre-built packages.

If you're building software yourself, however, it's common to use -lavcodec or similar, which will find libavcodec.so unversioned. Similarly, build scripts may expect these names to exist.

The unversioned names aren't required for the distribution packages, so they're not included by default, but as they're useful when building other software they're included in the -devel package. Other distributions make different delineations and include the .so link in the main package; both are reasonable choices.