Core Croatian (from Zagreb area) has a different accentuation, and from that resulting, a pace of pronunciation than Serbian, namely it is formed upon the Kajkavian dialect, which ends with 'l' rather than 'o'. Namely razumel, instead of razumio/razumeo (like in Serbian, or standard Serbo-Croatian).
For Croats to speak the standard, they have to change their speaking habit, their accentuation as well as pace of pronunciation; which for the Serbian ears sounds enforced and unnatural (therefore funny ), since Croats are not used speaking like that. This, together with the mistaking of č and ć, as well as its merging in one sound mostly (Croats although having both letters, rarely differ between them), is the main trait upon which a Serbian speaker would recognise a Croatian speaker. There are also vocabulary differences, common Serbs speak a more vulgar variant of Serbo-Croatian than Croats, using a lot of slang words, which Croats do not use. Serbs also use 'dakanje' while building the infinitive, Croats don't or very rarely. Although 'dakanje' is as far as I know not standard, Serbs are used to it and would rarely speak otherwise. Idem raditi > Idem da radim
Bosniaks use a lot more turkish words in their vocabulary. The pronunciation is the same as in Serbian, only the accent is regionally different. They are also known for inserting the letter 'h' in most words that allow it, like lako > lahako, kafa > kahva, sat > sahat, as well as losing vowels in pronunciation of some words, Sarajevo > Sarajvo etc.
Here one can hear them all (Bosniak, Croatian, Montenegrin, Serbian, Slovenian, Albanian speaking Serbian). Try to figure out who's who.