VLC for iOS 2.4.0 & 2.4.1

After a 5 month hiatus and a couple of delays in between, we are very happy to release version 2.4.1 of VLC for iOS to the general public today. Please see our press release for cross-platform information.

As an introductory remark, make sure to get the legitimate version of VLC. There are a number of clones on the iOS App Store right now, which violate both our copyright and our trademarks, include advertisement and usually charge $1 to $5 per download. We sent 39 DMCA take down notices against 48 apps over the cause of the last 12 months and in the end, we always succeeded. However, this can take up to 3 months, even for seemingly obvious violations.

As a consequence to those continued violations, VLC for iOS’s source code repository will no longer be publicly accessible, but archives of the stable releases only.

So, what’s new in VLC for iOS?

  • Support for iPhone 6 and 6+
  • Native support for Plex using their custom protocol
  • File Sharing with third party apps
  • Media library search
  • Custom URL scheme based on x-callback-url
  • Greatly improved UPnP support
  • In addition to uploading media via WiFi, you can also download all the media stored within VLC using a simple web browser
  • Streaming and folder support for Google Drive
  • Flat folder synchronization via iTunes
  • Options for default playback speed and FTP text encoding
  • On-the-fly audio and subtitles track synchronization
  • And a large number of small features, improvements and bug fixes as well as a new translation to Traditional Chinese.

This release removes support for Dolby Digital (AC-3), Dolby Digital Plus (E-AC-3) and Dolby TrueHD (MLP) for the foreseeable future due to a content dispute with Dolby Laboratories, which could not be resolved in a different way.

We are very happy with this major version of VLC for iOS and hope that you’ll like it as much as we do. Further, we are excited about the things we have in our pipeline for the forthcoming releases. A first beta of version 2.5 will be released to our testers today.

VLC media player for Mac OS X 2.2.0

Today, we will also a major new version of VLC for Mac OS X. For cross-platform changes, please have a look at the release notes and our press release.

What’s new in VLC for Mac?

  • Support for OS X Yosemite
  • Completely re-written web plugin for Chrome, Safari and Firefox is back!
    Improved fullscreen behavior
  • Continue playback where you left off
  • Improved playlist adding a file size column and an option to increase the font size
  • In addition to iTunes, Spotify can be paused on playback start
  • New encryption and decryption modules for SSL based on OS X’s SecureTransport library for FTP and HTTP connections. This greatly improves speed and security.
  • A lot of improvements in VLCKit for use in third party applications, notably
    • Switched the code base to ARC and added support for Swift projects
    • Support for HLS and HTTPS playback on iOS
    • Improved thumbnailing
    • Various new APIs for playlist handling, the equalizer, thumbnailing and meta data handling

We are excited about this major update of VLC for Mac and hope that you’ll like it as much as we do.

MobileVLCKit and VLCKit, part 2

This is a follow-up article covering VLC’s Objective-C framework to include its functionality in third party applications. If you missed the first part, click here.

Today, we will discuss meta data processing.

In VLCKit, every item you play is a VLCMedia object. For typical use cases, it can be created with an NSURL or an NSString containing a path.

We differentiate between two types of meta data: technical information describing the media such as codec, bitrate, video size and user-visible/-provided information such as artist, publisher name, album title.

Let’s start with the technical information, which can be retrieved from any media object with a single API call:

@property (NS_NONATOMIC_IOSONLY, readonly, copy) NSArray *tracksInformation;

This gives you an array containing as many dictionaries as the media contains tracks, be it video, audio or subpictures (subtitles, teletext). The track type is defined by the VLCMediaTracksInformationType key. All tracks will include information about the respective codec, bitrate and encoding details. Depending on track type, keys for video dimensions, audio channel numbers or text encoding will be set as well as an optional key for language.
Retrieving this property can potentially be very expensive, especially if your media is stored remotely as VLCKit will synchronously parse the source to provide this information. Therefore, we recommend you to cache this data, as it will probably not change during the lifetime of the VLCMedia object.
Note: for codec information, you’ll receive an integer which is a raw FOURCC representation of the codec name. Releases following VLCKit 2.2 will include a convenience method to translate it to an end-user readable string.

On mobile devices, you might run into the question if a given device is powerful enough to decode a given video file. For this purpose, VLCMedia includes the isMediaSizeSuitableForDevice property which will provide a reasonable guess. Note that this property will always be true on OS X.

Now, what about non-technical information about the media contents? To retrieve them, VLCKit needs to parse the source. This can be done both synchronous and asynchronous depending on the needs of your application. We generally recommend you to use the asynchronous way so you don’t block the execution of any threads. VLCMedia includes an optional delegate protocol, which allows you to follow meta data processing by receiving notifications every time further information becomes available as well as once parsing finished.
VLCKit can provide up to 17 different meta data keys with more to come in subsequent releases. While it allows to fetch them one by one, we recommend you to fetch the full dictionary using:

@property (nonatomic, readonly, copy) NSDictionary * metaDictionary;

If you have write access to your media source, you can also set values for the respective keys and save them to disk.

Thanks for reading!

If you have questions, don’t hesitate to use the comment section or to shoot a mail. The next part of this series will be about thumbnail creation.

MobileVLCKit and VLCKit, part 1

This article is a general overview and the start of a small series of articles covering the library, published at an irregular rate.

VLCKit is a generic library for any audio or video playback needs on both Apple platforms and also supports streaming and media to file conversations on the Mac. It is open-source software licensed under the LGPLv2.1 or later, available in source code and binary form from the VideoLAN website. You can also integrate MobileVLCKit easily via CocoaPods.

The foundation of this framework was laid in 2007 by Pierre d’Herbemont as part of a Google Summer of Code student project, in fact kind of mentored by me. Since then, it played major roles in developing the Lunettes prototype in 2008/2009, MobileVLC in 2010/2011 as well as take-two of VLC for iOS in 2013 until present.

When do you need VLCKit? Frankly always when you need to play media not supported by QuickTime / AVFoundation or if you require more flexibility. You want to play something else besides H264/AAC files or HLS streams? You need subtitles beyond QuickTime’s basic support for Closed Captions? Your media source is not your mobile device and not a basic HTTP server either, but perhaps a live stream hailing from some weird media server or even a raw DVB signal broadcasted on a local network? Then, VLCKit is for you.

But this is open-source software right? What does this mean for me and the end-user? And wasn’t MobileVLC removed from the App Store in 2011 for some crazy licensing reason?

First of all, open-source means for you, that you get access to the whole stack. There is no blackbox, all the sources are there at your fingertips. No reverse-engineering needed, no private APIs.

Then again, this must not be the case for your software. The LGPLv2.1 allows our software to be included in proprietary apps, as long as you follow the license. As a start, make sure to publish any potential changes you do to our software, make sure that the end-user is aware that VLCKit is embedded within your greater work and that s/he is aware of the gained rights. S/he is granted access to our code as well as to your additions to our work. For further details, please read the license and consult your lawyer with any questions you might have.

Regarding the removal of MobileVLC, the world moved on a bit. libvlc and VLCKit are no longer under the GPLv2 but were relicensed to the LGPLv2.1. While this looks like a play on characters, it is of major importance regarding distribution on the Mac or iOS App Store. As of now, the Terms of Service of either store are still incompatible with the GPLv2 (despite major changes and improvements), while distribution under the LGPLv2.1 is absolutely permitted.

Let’s get going with a technical overview and start with a layer model:

Layer model

Any layer can only communicate with the layer above and the layer below. Therefore, decoders are four abstraction layers away from the client app developer. Why is that a good thing? By having a decent amount of abstraction, it is no longer necessary for you to know which library is taking care of the decoding, rendering or parsing. You are wondering whether you need to decode your certain video in a multi-threaded or single-threaded way, think that decoding might be accelerated through the hardware in the iPhone 5S and above, but pondering what to do with older releases? libvlc will do the correct thing for you.
However, we allow flexibility. You know that you want to use a certain option on libavcodec because it’s cool (and for some reason, we decided against it?)? that’s a one-liner for you.

Okay, so how do you get going? Have a look at the SimplePlayback sample code available for download here. Ignoring the boilerplate code present in any empty iOS app project, this basic app shows you how to play a video in 8 lines of code and to allow the user to play or pause playback:

@interface RandomViewController ()
{
    VLCMediaPlayer *_mediaplayer;
}
@end
@implementation RandomViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    /* setup the media player instance, give it a delegate and
     * something to draw into */
    _mediaplayer = [[VLCMediaPlayer alloc] init];
    /* assign a random UIView or NSView to the player to
     * draw the video */
    _mediaplayer.drawable = self.movieView;
    /* create a media object and give it to the player */
    _mediaplayer.media = [VLCMedia mediaWithURL:
     [NSURL URLWithString:@“http://yourserver.com/folder/file.mkv“]];
}
- (IBAction)playandPause:(id)sender {
    if (_mediaplayer.isPlaying)
        [_mediaplayer pause];
    [_mediaplayer play];
}
@end

Give it a spin!

Then again, chances are that you are on iOS and you want to have a slightly more advanced user experience. Need a seek slider and a time display or would you like to crop the video a bit? Your media includes more than one audio or subtitles track and the user should be able to switch? The code is there for you. We wrote a self contained class and distribute it under the BSD 2-clause license. If you are interested, checkout the Dropin-Player project available here.

That’s it for the first part of this article. The second part will cover more advanced use-cases of VLCKit and will follow shortly.

If you have questions, don’t hesitate to use the comment section or to shoot a mail.

One last word regarding VLC for iOS and taking code from that project. A contrario to VLCKit or the provided sample code, it is protected by different licenses and different obligations. It is dual licensed under the GPLv2 as well as the MPLv2. Most importantly, it is absolutely not permitted to take any bits of code it unless your product is distributed under a compatible license. We have a good DMCA track record and we are monitoring both the Mac and the iOS App Stores constantly.

upnpx 1.3.0

When I started to work on VLC for iOS last summer, it quickly became apparent that it would need to support playback from local media servers announced over the UPnP protocol. I came across a Objective-C++ library named upnpx which suited my use case nicely and which included broad support for all the various UPnP dialects.

Regrettably, upnpx was not maintained anymore since a few months, so I started a private fork within VLC for iOS and eventually moved on to github. Nowadays, my fork is officially endorsed by the original developer Bruno Keymolen.

This week, I did a first release of upnpx since the fork. Version 1.3.0 includes full support for iOS 8 and the 64bit runtime as well as fixes to a lot of logical runtime bugs and crashes. Additionally, it adds new APIs for MediaServer1ItemObject, BasicUPnPDevice, as well as server notifications.

I’m particularly happy about the fact that 8 people contributed to this fork and several hundred people are deploying it in their apps.

So, please get the tarball or add it through CocoaPods, deploy it in your app and report any issues or feature requests you might have!  Let’s see where this goes!

VLC media player for Mac OS X, versions 2.1.4 and 2.0.10

HEVC sample

Today, we released 2 versions of VLC media player for Mac OS X targeting different client systems.

Version 2.1.4

This is a small bug fix release, which improves an important regression regarding DVD playback and improves compatibility with HUffYUV contents by upgrading the respective decoder library. Additionally, a rare issue with some specifically crafted wmv files was fixed and a misleading error message no longer appears during video playback on OS X Mavericks.
Grab a copy here or trigger the internal updater if it doesn’t prompt you right away.

Screen Shot

Version 2.0.10

More than 3 months after the last update to VLC’s 2.0 release series, this minor update includes security updates for third party libraries, stability improvements and increased battery life when using a Mac with more than one graphics card.
While we generally recommend anyone using a Mac with OS X 10.6 or later on a 64bit-capable device to deploy version 2.1.4 linked above, VLC 2.0.10 is a great thing to enjoy your media if you decided to stay on OS X 10.5 or if you are using a PowerPC or 32bit Intel-based Mac.
Fetch the PowerPC binary here or grab the Intel variant there. The update is also appearing in VLC’s internal updater.

Screen Shot

VLC for iOS, version 2.2.1

iphone5s-black-player-1

Today, we released a small update of VLC for iOS. It solves the most important regressions in last week’s 2.2 major release, but also includes a major improvement: full initial support of 64bit aka AArch64 aka arm64 on late 2013’s iPhone and iPad thanks to a close collaboration with the libav team.

Additionally, we added enhanced support for a broader set of UPnP servers, notably Twonky 7, Serviio 1.4 and XMBC 12, and resolved an inconvenient memory management issue in the underlying upnp library, which lead to the weird behavior that from a full folder only a single file would actually be played over and over again.

Regarding VLC for iOS’ networking capabilities, the option to manipulate the caching level was implemented in the same way as known from its desktop counterparts. Furthermore, ftp streams respect non-ASCII file encodings and URLs with spaces correctly now. Streaming from Dropbox is more reliable, too.

Finally, we increased the readability of metadata displayed on iPad (iOS 7), solved stability regressions on iOS 6 and implemented a more intelligent thumbnailing mechanism.

Oh, and your TV show episodes disappeared with the last update? That’s solved, too. Sorry for the confusion and the trouble this database edge-case caused.

ipad-air-black-landscape-player-3