DirectShow Playback Guide

From wiki.jriver.com
Revision as of 14:24, 23 March 2010 by Yaobing (talk | contribs) (→‎FLV)
Jump to navigation Jump to search

Native DirectShow filter support was added to MC11.1 in December 2005 and has been improved dramatically with MC12. DirectShow is a multimedia API released by Microsoft which became a standard component of Windows with Windows 98. It is essentially a replacement for the earlier Video for Windows technology. In Windows Vista this technology has evolved into the Windows Media Foundation, which performs similar services. It provides developers with a unified interface across different programming languages to allow their applications to render or record media files, using a filter based framework.

MC12 has greatly expanded DirectShow playback configuration options and support.

What is DirectShow? What is a DirectShow filter?

Media Center plays many media formats in DirectShow, including DVD and many video and audio files. DirectShow is a Microsoft technology for playing (and recording) audio/video media on a Windows computer.

DirectShow uses the concept of “Filter Graph” to take a multimedia file on disk and turn it into what you see or hear from your computer. A filter graph is like a chain of individual “DirectShow Filters”. A filter is a software component in DirectShow that will work with other similar components to render a media file. They are sort of like little "plugins" for DirectShow that allow it to handle different types of media, different types of files, or perform transformations on the media data. Each filter in the Filter Graph chain processes audio/video data in a specific way to facilitate the playing of the media files. Filters have “pins” - points of connection between filters, both input pins and output pins. Pins are the means by which media data is passed from one filter to another filter. For example, the Input pin of the Haali Media Splitter will receive the data from the file, split it to it's component parts and then output those "streams" via it's output pins. FFDSHOW will then connect it's input pins to Haali's output pins and decode the video stream.

You can use the free GraphEdit utility from Microsoft to manually build filter graphs if you want to play around with how this works.

GraphEdit with a x264 compressed MKV file loaded, showing the default filter graph.
The pins are the connections between the different filter boxes, with outputs on one end and inputs on the other.

Filter Types

further information: DirectShow Playback Guide: Filter Types

Generally speaking, there are three types of filters in terms of functionality: Source filters, Transform filters, and Render filters.

Before explaining what these different types of filters do, it is useful to understand a bit more about how multimedia content is stored in files on disk. With most media files, there is a distinction between the file container format and the individual media stream types (sometimes referred to as the codec or the FourCC of the file) "contained" inside the file. The container format is essentially the file you see on your hard drive (the AVI, MKV, MP4, OGM, or whatever) which is used to identify and interleave the different media stream types. It is the individual media streams inside the container which make up the actual media, including metadata tags, video streams, audio streams, subtitles, and other information. So, wrapped up inside the AVI or MP4 file there will be one or more different types of media, usually compressed with a codec of some type. A codec is a special type of filter (or other similar software) that can both encode a media stream to a compressed format, and decode a stream from that same compressed format -- a COmpressor/DECompressor, which is how it gets its name.

GraphEdit with the filters labeled.

To play back a file properly via DirectShow you always need at least one Source Filter and one Render filter. Usually, however, you need one Source Filter, one or more Transform filters, and one or more Render Filters. The Source Filter (often referred to as the Splitter Filter) reads the file container format and splits out the different "streams" of data contained within. This data is usually then passed over to a set of Transform filters which decode the different media streams (including audio, video, and metadata, such as subtitles). These Transform filters are often (somewhat erroneously) called Decoder Filters, or Codecs (which stands for enCODer/DECoder), because they often take care of decompressing the media. Because uncompressed video footage is incredibly huge, compression is almost always used to keep file sizes lower. Generally you'll need one decoder filter to process each "stream type" that comes out of the Source Filter (though many, like FFDSHOW, handle more than one type of stream). They then pass the raw decoded data to the Render filters which transforms the uncompressed raw data into what you see on screen and hear through your sound device.

Sometimes these lines blur, when a particular filter can act as both a splitter and a decoder filter (such as FFDSHOW), or Haali which also processes and decodes some of the data streams (subtitles for example). Also, when you play back uncompresed media (such as an uncompressed audio track) you do not always have a transform filter and the source pin connects directly to the render filter.

How DirectShow Decides Which Filters to Use

MC supports a number of audio file types natively. When you play back a MP3 file, for example, MC uses it's own internal high-quality filters to split and decode the file and send it to the appropriate output device (sound card). When you attempt to play a file back in MC that it doesn't support natively, MC tries a number of different things to get the file to play. The first step is to attempt to render the file using DirectShow.

By default, if you haven't modified the DirectShow playback configuration options in MC, and you play a file back, it simply asks Windows to build the regular DirectShow graph. This works the same as Windows Media Player and any other DirectShow player does when playing back a file.

Illustration of how Filters get selected. In the example, even though all of the filters support MP4 playback, DirectShow will use the Haali filter because it has the highest Merit Score.

The default graph is built based on two factors: a) each individual filter "tells" DirectShow what kinds of media streams it is able to render, and b) DirectShow assigns (or more precisely, the filters assign to themselves when you install them) a priority number called its "merit score".

When you play a file, DirectShow attempts to build a chain of filters capable of decoding the content based on these two pieces of information. It tries filters matching the stream type, in the order of which filter has the highest priority first. If the "render" fails, then it tries the next highest priority set, and so on and so forth until it runs out of options or succeeds. Just because it "works" doesn't mean it's necessarily finding the "best" filter graph. It just uses whichever one it "bumbles" into that works first.

MC's DirectShow Playback settings dialog overrides the priority part of this sequence of events. If you select one or more of those filters, it overrides the normal merit score system (perhaps by temporarily elevating them to the highest possible Merit -- I'm not sure of the details of this mechanism). So, you can force it to "try" to use a different filter to play a file back, but you can't force it to use one or fail outright. If that graph fails (the output pins can't connect to the input pins to build a complete render graph) then it either ignores certain selected filters, or it fails over completely to the default graph. (MC's DirectShow Playback Settings dialog provides essentially identical functionality to ZoomPlayer's "Smart Play" feature.)

I've simplified this a bit for the sake of explanation, but that's the general idea of what happens when you try to play a file back via DirectShow.

What version of DirectX do I need?

In order to play media using DirectShow, you must have Microsoft DirectX installed. We recommend DirectX 9.0c to take advantage of features that are available only in late versions. While technically DirectShow itself was removed from the larger DirectX package in April 2005 (and moved to the Microsoft Platform SDK instead), MC still makes use of many DirectX features and it is still critical to ensure that you have installed the most current version of DirectX on your system.

DirectX 9.0c is included as part of the Windows XP Service Pack 2 update, so if you are running Windows XP SP2 it is likely that version is already installed on your computer, and you do not need to do anything in most cases. For earlier versions of Windows operating system, we recommend you download it from Microsoft website and install it.

Windows Vista ships with DirectX 10, which Microsoft says will not be made available for older versions of Windows. DirectX 10 has been completely overhauled from earlier versions. Like all versions of DirectX, it is completely backwards compatible with older versions of DirectX. If you are running Windows Vista, DirectX 10 is what you want to have!

To check which version of DirectX is installed on your computer using the dxdiag tool, please refer to Microsoft KB Article 157730.

Why do I need to get DirectShow filters?

In short, you don't need to, but you'll probably want to! The entire purpose of DirectShow is to allow the system to easily expand to support new media types through the "plug-in" Filter architecture.

In order to play media files in DirectShow, one must have DirectShow filters that can handle the media types to be played. DirectShow comes with some of the filters that are needed, for example video and audio renderers and MPEG-1 filters. DirectShow, however, does not include all filters that are needed to handle common (and more modern) media types. So, you must make sure you have appropriate filters for the file types you want to play. DirectShow filters come from a variety of sources. We do not, and can not, include all filters that are needed in Media Center‘s installation. In most cases you will need to install decoder filters from other sources. For example in order to play DVD on your computer you must have DVD capable MPEG-2 video decoder, and audio decoder(s) that are capable of decoding MPEG-2 audio and/or AC3 audio formats.

Another important example is M4A audio files. M4A files are simply MP4 files that contain only an audio stream (usually AAC encoded). In order to play these files back you need to either have Quicktime Player installed, or you need to install the proper DirectShow filters and enable DirectShow M4A support. Generally, DirectShow playback will give better results for M4A files, but because most people have Quicktime installed already, MC disables DirectShow support in favor of Quicktime by default.

Some computers do come with certain filters installed by the computer vendor. However, the filters preinstalled may not be top-notch filters. In such case it is to your advantage to find and install better filters..

How do I install DirectShow filters?

It depends on the filter. Some filters come with an installation program. You just need to execute the program, and the installation wizard will guide you through the process. Most filter packs are installed this way, via the standard "setup.exe" Windows software installation motif. Then, to remove them, you just go the the standard Add/Remove Programs Control Panel and proceed normally.

Unfortunately, not all filters come with an installation wizard. Instead they are just one or more files with file extension .ax or .dll, often contained in an archival file (ZIP or RAR). In such a case, you first need to extract the file(s) into a folder where you'll be able to find them using a program like ZipGenius or WinZip. Any folder is fine, really, but I like to use C:\Program Files\DirectShow_Filters\ (because it's then easy to find the filters later if I need to uninstall or update them).

Once you've extracted the filter files to an appropriate folder, you then need to register the filter using the Windows program Regsvr32.exe. This program exists on every Windows computer in your System32 directory (inside the Windows folder). To do this, simply call the regsvr32.exe program and give it the path to your new filter as its command line argument.

For example, if you downloaded a filter whose file name is NewFilter.ax, and you placed the file in “C:\Program Files\DirectShow_Filters\“, you can register it by going to the Start button and choosing “Run”. Then enter the following line (including quotes) in the box that appears:

regsvr32.exe "C:\Program Files\DirectShow_Filters\newfilter.ax"

When you click OK a dialog box should pop up saying "DLLRegisterServer in C:\Program Files\DirectShow_Filters\newfilter.ax succeeded", indicating that the filter is now registered with the system. That's it! You've now successfully installed the filter.

Successfully registered FLVSplitter.ax to enable FLV Video playback in MC!

NOTE: Some filters may come with two versions of them, a Unicode version and a non-Unicode verion. You should register the Unicode version as Media Center supports Unicode.

If you ever decide you don't need a particular filter anymore, you can also unregister a filter in much the same manner, by using the command line parameter /U. For example to unregister the filter registered in the above example, you issue this command:

regsvr32.exe /U "C:\Program Files\DirectShow_Filters\newfilter.ax"

In this case you will get a confirmation saying “DllUnRegisterServer in C:\Program Files\DirectShow Filters\newfilter.ax succeeded.” You are then free to delete the filter file(s) from your system.

What filters do I need and where do I get them?

The answer depends on what media format you want to play. In general you will need decoder filters and, in many cases, you will also need splitter filters. You can obtain commercial filters from various vendors. You can also get free, open source, filters. In this guide we will tell you about some free filters.

Before getting to individual media formats, it is a good idea to introduce/recommend CCCP, a multi-filter and multi-format decoder package. If all you want is for your video and audio files to work reliably, with a minimum of effort (and no money), then CCCP is probably the way to go.

CCCP - Combined Community Codec Pack

CCCP's Configuration Utility (first page).

The Combined Community Codec Pack (CCCP) is a great multiple-filter pack that provides filters for playback of most media formats, including full DVD playback support out-of-the-box. At the heart of CCCP is FFDSHOW, which is a general purpose DirectShow filter that can be used to decode a large number of media formats. CCCP also includes quite a few other major components, including: MPV video decoder (decodes DVD and other MPEG-2 video), and Haali Media Splitter (handles decoding MP4, MKV, M4A, and a number of other container formats). CCCP uses custom settings for and custom versions of many of the individual codecs and filters which make up the pack, so installing CCCP is a better solution than installing the components separately.

This "pack" is probably the simplest method to get most file types to play back reliably. There are a few file types that CCCP does not support out of the box. These include Quicktime, RealMedia, and FLV video (though it tries at FLV). Adding support for these file types is described below, though the CCCP Project site has much more information on this topic. As described on their wiki, the CCCP was created "to replace the filter packs created by several anime fansub groups into a single reliable pack capable of decoding practically any group's files -- without breaking compatibility for other formats." It was also a response to the other available "mega-codec-packs" that had become commonly used and were notorious for causing all sorts of problems (some of which require a full nuke-and-pave of the system to correct). The primary design goal was, like the physician's creed, "first, do no harm." It is, by no means, the only option for playing back your different media types (read below for some other options) but it is a very good, simple, stable option.

One important note is that if you want to play back AVI files with multiple audio streams, FFDSHOW takes some additional configuration.

They have a truly fantastic set of FAQs on their site that can help you get it set up, expanded, and working optimally. There is also a meticulous step-by-step Troubleshooting Guide which can help you solve almost any problem you might encounter with it.

Make sure you read the instructions before installing CCCP. As a general rule, you should uninstall any previously installed codec packs, as different codec packs often conflict with each other. You should also uninstall previously installed individual filters that CCCP includes, such as FFDSHOW, Haali Media Splitter. This way you will be sure that CCCP can install and configure the filters properly.

Additionally, when installing CCCP, make sure you uncheck the option to install FLV Splitter. The version of FLV splitter included with CCCP does not work well. See "FLV" below.

DVD and MPEG-2 Playback

further information: DirectShow Playback Guide: DVD and MPEG-2

For DVD playback, you need DVD capable MPEG-2 video decoder and a MPEG-2 / AC3 audio decoder. These filters may or may not already exist on your computer. Some computers come with filters for DVD; some do not. Filters may also come with installation of some third-party software. If you do not already have the needed filters, you may need to install them. Commercial decoders are available from various vendors. Free decoders are available and described below.

Again, CCCP fully supports DVD Playback out of the box. The simplest free method to enable DVD Playback support is to just use CCCP. Once installed go into FFDShow Video Decoder configuration which can be found in 'All Programs' from the Windows Start Menu and then in the codecs list find MPEG2 and make sure it's set to libmpeg2 or libavcodec (Experiment with both for the best results. Some machines prefer one or the other). Also tick the DVD decoding box. Failure to do these things will cause DVD Decoding to fail.

The only other configuration step typically required is to enable Dolby Digital (AC3) decoding support in FFDSHOW (which is included as part of CCCP). This process is explained on the Dolby AC3 page.

If you'd prefer not to use CCCP, or if you have special needs, there are a wide variety of other Filters available that can handle DVD playback. Some of these alternative options, if properly configured, can provide absolutely stunning playback quality which meets (and often exceeds) the quality available from the best set-top upscaling DVD Players commercially available. Check the DirectShow Playback Guide: DVD and MPEG-2 page for further information.

Additional Useful Filters

As mentioned above, CCCP does not include each and every filter you could possibly need to have in order to support your media. The best place to look for more information is on the CCCP Wiki page describing Unsupported Formats. However, here are a few of the big ones:

Real Alternative

Real Alternative is a free, open source implementation of the Real playback engine, which handle Real Media file types without having to install the "real" RealPlayer. It is essentially a set of DirectShow filters that allows DirectShow to natively handle RealMedia files. Please note: When installing RealAlternative, you don't need to install MPC again as it's included as part of CCCP. KL Software (the group that releases the Real and Quicktime Alternative packages) now has a "Lite" edition of both Alternatives that are identical to the full version but it doesn't include Media Player Classic. It's best to download and use the Lite Edition if you will be using it with CCCP.

Apple Quicktime Player

MC uses Quicktime as its "fallback" rendering engine if DirectShow playback fails. So, it's a good idea to have Quicktime installed even if you don't use any Quicktime Media. Quicktime Player is available for free from Apple. You do not need to choose the version that includes iTunes -- there is still a standalone player version available. Quicktime is available free of charge from Apple for a variety of platforms.

You can spend a lot of time discussing the relative merits of and problems with Apple's QuickTime engine and player software. It is certainly far from perfect, but it does work for a large number of users and is well supported. Installing the full Apple Quicktime Player is an easy way to extend the file type support of MC, and is required to use any DRM-protected M4P files you may have purchased from the iTunes Store.

Installing Quicktime can sometimes create more problems than it solves because of some of the default settings the application uses when you install it. All of these annoying qualities can be mitigated or eliminated by being very careful as you proceed through the installation process, and by taking a few steps after the installation is complete. For a detailed guide to installing Quicktime in the least annoying method possible, refer to the Quicktime Installation Guide at CodecGuide.com.

Quicktime Alternative

Similar to RealAlternative, you can also choose to install Quicktime Alternative instead of the "real" Quicktime. This will allow Quicktime MOV files to play back via DirectShow. If you choose the Alternative, same as RealAlternative, you don't need to install MPC, as it's included in CCCP so be sure to download and use the Quicktime Alternative "Lite" Edition (which is identical to the full version but it doesn't include MPC). It is actually a good idea to install at least the Splitter portion of Quicktime Alternative, even if you use the full, Apple version of Quicktime. This will allow your Quicktime MOV files to play back in regular DirectShow applications. MC12 can handle Quicktime files as long as either QuicktimeAlternative or the official Apple QuickTime package is installed on the system.

Apparently, Quicktime Alternative may not be updated as regularly anymore (the current status is unclear). An alternative to the alternative is QTLite. QTLite differs from Quicktime Alternative in that it doesn't contain MPC or any DirectShow filters. Therefore, if you use only QTLite, you will also need to be sure that you have appropriate MPEG-4 DirectShow filters installed to handle playback. Both CCCP and KLCP are equipped to handle this part of the job.

FLV

FLV, flash video, is a format widely used for streaming. For example Google video and YouTube use this format. This format should play correctly in Media Center without user actions. However, if you do have problem playing them, you need to make sure the following filters are properly installed and configured.

To decode the Flash Video Codec: FFDSHOW

You need to configure it so it will decode FLV video. Media Center should configure it for you automatically, but here is how you can do it manually:

Start -> All Programs -> FFDShow (or Combined Community Codec Pack) -> FFDShow Video Decoder Configuration. Choose "Codecs" from the top of the left panel. On the right panel, find FLV1 in the first column ("Format"), and change the value in the second column ("Decoder") from "disabled" to "libavcodec". Click OK.

To install the FLV Splitter:

First, you need to download the file. You can get it from Source Forge here. Simply click on external filters (unicode) underneath Media Player Classic in the left-hand navigation bar, and then choose FLVSplitter.7z from the list of files that comes up. Then unzip and Register it using these instructions.

Note: The latest CCCP also includes a version of FLVsplitter that does not work with Google/YouTube videos. You should use the version linked here (built by Celtic Druid), which, in addition to being able to play FLV1 videos from Google/YouTube when used with FFDShow, also includes an FLV Video Decoder filter which decodes FLV4 format (FFDShow decodes FLV1).

Alternative Source and Transform Filters

further information: DirectShow Playback Guide: Alternative Filters

While CCCP is the easiest way to get your system working, there are alternatives of course. For more information on many of the available alternatives, please read the DirectShow Playback Guide:Alternative Filters page.

Some of these alternatives include: FFDSHOW (standalone), DivX and XviD, CoreAVC, and some hardware accelerated filters. There is also information included on filters required to handle new and modern File Container formats such as MP4, M4A, MKV, and OGM. Many of the components listed are the same ones included as part of the CCCP set. These are all available separately though and can be mix-and-matched on your own for advanced purposes.

Additional Useful DirectShow Tools

There are a number of other tools that, while not actually DirectShow Filters, are extremely useful to have installed on your system to help in diagnosing any issues you may have and for altering DirectShow related settings and configurations.

  • G-Spot Codec Information Appliance: GSpot is a free utility which identifies specific media streams inside the container file and supplies other information as well. If you get no other extra tools, this is the one you want.
  • RadLight Filter Manager: Allows you to change merit of DirectShow filters and it can also be used to list all registered codecs and to register or unregister codecs.
  • DirectShow Filter Manager: Very similar to RadLight Filter Manager.
  • FourCC Changer: Read the FourCC code from any given AVI file and allow you to set anything in it's place.
  • Microsoft GraphEdit: GraphEdit is a visual tool for building and testing filter graphs.
  • AVI Fixed: Rebuilds the headers of broken or partial AVI files.
  • VobSubStrip: Can selectively remove individual subtitle streams from AVI files.

Advanced DirectShow Configuration in MC12 and later

As mentioned previously, J. River MEDIA CENTER includes a number of new features which greatly expand your ability to customize the behavior of the DirectShow filters used to render your media files. Most of these new features can be found in the DirectShow Playback Options dialog. This dialog can be found by going to: Tools --> Options --> Playback --> Video--> DirectShow Playback Settings. NOTE -- this moved to Options --> File Types in MC13.

The new DirectShow dialog box in MC12.

DirectShow Playback Options

On the right hand side of the dialog is the DirectShow filters list. The primary purpose of this list is to allow you to enable and disable DirectShow support based on what type of file it is. If the box next to the given file type is checked, MC will attempt to decode any files you play of that type via DirectShow. Conversely, if the box is unchecked, then MC will try to render the file via other means (often via Quicktime).

Note: I am not clear on what happens here. I know that MC will "fall back" and use Quicktime in many circumstances, but is there anything else that it tries (like the WMP Engine for example)? What happens if you uncheck a box that isn't supported by Quicktime -- does the file just fail to play then?

Video Playback Options

On the left side the dialog gives you a range of global options over how the video and audio will be rendered. These options are not File Type specific, but universal to all DirectShow types. Note that the Video Controls only work while you have a file actively playing back. The other controls here include:

  • Use Windows Media Player engine for video playback when possible: This tells MC to try to use the rendering engine from Microsoft's Windows Media Player to render the file. This engine has advantages and disadvantages, but it can be useful especially for DRMed Video Media.
  • Aspect Ratio: These controls let you override the video file's source display aspect ratio to correct video files that were encoded improperly or where the player doesn't correctly determine the proper aspect ratio.
  • Audio Renderer: Lets you choose from the different available Audio Renderer filters available on the system on a per-zone basis.
  • Crop Edges: zooms the image slightly to compensate for the non-overscanned computer display.
  • Use WMV Acceleration: enables/disables hardware WMV Acceleration (I think -- is it hardware or some software optimization?)

You can also tag individual Video files with specific settings for many of these controls see Customisable Video Playback

DirectShow Filters

Customize DirectShow playback filter for individual file types in MC12.

Perhaps more importantly, if you select one of the file types from the list and then hit the Select Filters button, it opens a new dialog where you can configure the specific filters that you'd like MC to try to use to render whenever it plays that particular file type. This dialog is pictured on the right.

In this dialog, you can choose a Source Filter (maximum one), and one or more Other Filters (which are mostly just Transform decoding filters). You may choose more than one Other Filter and MC will try to render a graph using all of them. While I am not clear on the exact mechanism used to do this internally, MC essentially overrides the Merit score on the filters you choose here when a specific file type is played back. This is far more powerful than is available via modifying the Merit Scores for filters directly, because a particular filter only gets one Merit score, but may be able to handle many different file and codec types.

Please bear in mind, this dialog does not force DirectShow to use only the filters you have selected and no others. This dialog is more of a way to force DirectShow to try your particular set of filters to render the file first. As usual, if that filter combination fails (the input pins can't connect to the output pins in the graph), then DirectShow will take over and build the default graph and try to play the files. You also do not need to select both a Source and an Other filter. If you select only one component (or no components) then DirectShow will also build the default graph and render the file, but it will try to use any filters you selected first (though often these filters go together in "sets" so it may be more effective to do so).

In this same dialog, you can choose which Video Renderer to use to try to play back the file. Three choices will be available on all systems: VMR9, VMR7, and Legacy Video Renderer (Overlay). Users of Windows Vista, or Windows XP with .NET 3+ installed, will also be able to choose the Enhanced Video Renderer (EVR). Finally, users with Haali Media Splitter installed will also be able to choose the Haali Video Renderer.

Again, all of these options will be applied only to the specific media type that you had previously selected when you hit the Select Filters button in the DirectShow Playback Options dialog box.

Filter Configuration During Playback

You can also configure and work with these filters actively while the files are playing back. Simply right click in the video window inside Playing Now (or Display View) and choose DirectShow Filters. This presents you with a pop-out menu which lists each of the filters being used in the current graph, in order (with the Source Filters on the bottom and the Render Filters on the top of the stack).

Filter adjustment during playback. Inside lies a video tweaker's paradise.

From here you can select any of the presented filters and MC will launch that filter's UI. These UI's often display an informational dialog (showing frames played and stream information), but with many filters you can also make an array of adjustments to the media stream as it is being sent to the renderer (such as in FFDSHOW). Many of these adjustments work "live" (meaning that they are applied on the fly while the video is playing back. You can also choose Select Filters and configure the filters that will be used for this file type (you may have to stop and re-start playback for these changes to take effect).

From within the right-click menu while you are playing a video back you also have the Video Playback Settings choice. This will actually open up the DirectShow Playback Options dialog discussed at the beginning of this section. However, now the Video Controls will be enabled and can be used to adjust the chroma and luma controls on the fly while the video plays back.

See Also

External Links