I have seen a common problem with Sitecore Media Library assets. If users upload the files As Files using the checkbox shown below, you can run into problems in load balanced environments and environments with different websites for the Stage and Live databases.
When you publish the media assets, their container or pointer is moved from the master to the web database in Sitecore, but the file assets in the file system are not moved by Sitecore. You could setup a file replication application, but who wants to do that when there is an easier way.
1. Configure the files to be uploaded as database blobs.
<!-- UPLOAD AS FILES
Determines if media should be uploaded as files or as database blobs.
<setting name="Media.UploadAsFiles" value="false" />
2. Edit the Web.config file to remove the checkbox option from the user.
<!-- UPLOAD USER SELECTABLE DESTINATION
Defines if the user can select the destination database or file.
<setting name="Upload.UserSelectableDestination" value="true" />