Planet VideoLAN

Welcome on Planet VideoLAN. This page gathers the blogs and feeds of VideoLAN's developers and contributors. As such, it doesn't necessarly represent the opinion of all the developers, the VideoLAN project, ...

VLC for Android

March 13, 2018

MobileVLCKit and VLCKit, part 3

Felix Paul Kühne

This is part of an article series covering VLC’s Objective-C framework, which we provide to allow inclusion of all its features in third party applications as well as VLC for iOS and Apple TV.

Previously published:

Today, we will discuss thumbnailing of video content. We need to differenciate two key aspects: saving still images of a currently playing video (snapshot) and previewing media stored somewhere without being played (thumbnail). While either way, VLCKit will open the resource, decode the bitstream and provide you with a image, performance and usability will differ.


Let’s start with thumbnailing a non playing media source, which can be stored locally or remotely.

@implementation DummyObject <VLCMediaThumbnailerDelegate>

- (void)workerMethod
    // 1
    NSURL *url = [NSURL urlWithString:@""];
    VLCMedia *media = [VLCMedia mediaWithURL:url];

    // 2
    VLCMediaThumbnailer *thumbnailer = [VLCMediaThumbnailer thumbnailerWithMedia:media delegate:self];

    // 3
    CGSize thumbSize = CGSizeMake(800.,600.);
    thumbnailer.thumbnailWidth = thumbSize.width;
    thumbnailer.thumbnailHeight = thumbSize.height;

    // 4
    [thumbnailer fetchThumbnail];

- (void)mediaThumbnailer:(VLCMediaThumbnailer *)mediaThumbnailer didFinishThumbnail:(CGImageRef)thumbnail
    // 5
    if (thumbnail) {
        UIImage *thumbnailImage = [UIImage imageWithCGImage:thumbnail scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
        if (thumbnailImage) {
            // TODO: do something with the thumbnail!

- (void)mediaThumbnailerDidTimeOut:(VLCMediaThumbnailer *)mediaThumbnailer
     // TODO: Show a reaction

  1. We need to create a NSURL instance along with its VLCMedia representation. Note that the URL may point to both a local or a remote resource.
  2. We create the thumbnailer instance for our media and point to ourselves as a delegate to receive the thumbnail.
  3. We define the size of the resulting thumbnail.  If width and height are set to zero, the video’s original size will be used. If you set either width or height to zero, the aspect-ratio is preserved.
  4. Finally, we call the thumbnailer’s worker function.
  5. Asynchronously, after about two to twenty seconds, we will receive a response from the thumbnailer to the delegate. It is important to check the thumbnail for NULL before trying to bridge it to a UIImage or NSImage as well as afterwards as the translation can fail. That’s all.

You might be wondering how the thumbnailer decides which frame to return. This is based on a more complex algorithm currently depending on the media’s duration and availability of key frames. Future versions may also analyze the image content.
You can overwrite this algorithm with the thumbnailer’s snapshotPosition property (with a 0.0 to 1.0 range).


The VLCMediaPlayer class includes a very basic API, which allows the creation of an infinite number of snapshots during playback, which will be asynchronously stored as local files. The size parameters follow the same pattern as for the thumbnailer.

- (void)workerMethod
    // ...
    [_mediaplayer saveVideoSnapshotAt:(NSString *)path withWidth:(int)width andHeight:(int)height];
    // ...

As soon as the snapshot was stored, a VLCMediaPlayerSnapshotTaken notification is emitted and mediaPlayerSnapshot: is called on the media player’s delegate. Note that the delegate call is available on iOS and tvOS only.
As a convenience starting in VLCKit 3.0 on iOS and tvOS, the media player class exposes the lastSnapshot and snapshots properties, which provide a UIImage instance of the last shot as well as a list of files of the taken shots.

That’s all for today. Enjoy using VLCKit!

March 13, 2018 12:27 PM

February 19, 2018

VLCKit 3.0

Felix Paul Kühne

10 days ago, we published VLC media player 3.0 for all platforms. It’s the first major release in three years and brings a huge number of features, improvements and fixes. Get an overview here and the full changelog there.

For VLCKit, we improved performance and memory management, added new APIs and you get all improvements from the underlying libvlc including full support for decoding H264 and H265 using VideoToolbox in hardware. Instead of using all cores of your iPhones CPU at 100%, decoding a 4K video uses less than 20%.
Further you can look at all aspects of a 360° video with touch gesture based controls, discover and browse shares on your network with UPnP, NFS, FTP, SFTP and SMB and more.

As you remember, we published VLC for Apple TV in January 2016, but so far, we never made VLCKit available on tvOS. In addition to MobileVLCKit for iOS, we now introduce TVVLCKit for tvOS!

For macOS, iOS and tvOS, VLCKit 3.0 is available through Cocoapods as a precompiled binary under the LGPLv2.1 license. You can find the source code on our website – contributions welcome!

We are looking forward to all your feedback and the apps deploying VLCKit to deliver multimedia to their users.
Do you want to learn more about integrating VLCKit? Have a look at the tutorials I wrote not too long ago (Part 1, Part 2).

So what did we change in VLCKit, API-wise?

New APIs:
- VLCAudio
 - setMuted:

- VLCDialogProvider
 - new class to handle user interaction with VLC events

- VLCLibrary
 - added properties: debugLogging, debugLoggingLevel

- VLCMediaDiscoverer
 - added selector: availableMediaDiscovererForCategoryType:
 - added enum: VLCMediaDiscovererCategoryType

- VLCMediaListPlayer
 - added selectors:

- VLCMediaPlayer
 - added properties:
 - added selectors:
 - added notifications: VLCMediaPlayerTitleChanged, VLCMediaPlayerChapterChanged
 - added enum: VLCMediaPlaybackSlaveType
 - play's return type was changed from BOOL to void
 - hue is now a float instead of an integer
 - Return value of the following methods changed from INT_MAX to -1

- VLCMedia
 - added keys: VLCMetaInformationTrackTotal, VLCMetaInformationDirector,
 VLCMetaInformationSeason, VLCMetaInformationEpisode,
 VLCMetaInformationShowName, VLCMetaInformationActors,
 VLCMetaInformationAlbumArtist, VLCMetaInformationDiscNumber,
 - added selectors:
 - added enums: VLCMediaType, VLCMediaParsingOptions, VLCMediaParsedStatus, VLCMediaOrientation, VLCMediaProjection
 - changed behavior: media will no longer be parsed automatically if meta data is requested prior to concluded parsing

- VLCMediaList
 - changed behavior: lists of media objects added through arrays or on init are no longer added in reverse order

- VLCTime
 - added selectors:

- VLCAudio
 - added property: passthrough

Modified APIs:
- VLCMediaList
 - To match the KVC bindings, all NSInteger arguments were moved to NSUInteger as appropriate
 - mediaList:mediaAdded:atIndex:
 - mediaList:mediaRemovedAtIndex:
 - addMedia:
 - insertMedia:atIndex:
 - removeMediaAtIndex:
 - mediaAtIndex:

Deprecated APIs:
- VLCAudio
 - setMute:
- VLCMedia
 - parse, isParsed, synchronousParse
- VLCMediaDiscoverer
 - availableMediaDiscoverer, localizedName
- VLCMediaPlayer
 - titles, chaptersForTitleIndex:, countOfTitles, framesPerSecond, openVideoSubTitlesFromFile:
- VLCMediaListPlayer
 - playItemAtIndex
- VLCStreamSession
- VLCStreamOutput
- VLCMediaLibrary

Removed APIs:
- VLCExtension
- VLCExtensionsManager
- VLCMedia:
 - fps
 - media:metaValueChangedFrom:forKey:
- VLCMediaPlayer
 - audioTracks
 - videoTracks
 - videoSubTitles
- VLCServicesDiscoverer
- VLCPlaylistDataSource

February 19, 2018 03:22 PM

February 09, 2018

Announcing VLC 3.0 release!

Geoffrey Métais

Version 2.5 has been a nice upgrade for VLC on Android. Now it’s been stabilized, and we are finally shipping the long awaited version 3.0!

VLC 3.0 is the first ever synchronized release between desktop application and mobile ports. Today, VLC is released everywhere, with the same version number and at the same time. It will be simpler for everyone, including VideoLAN developers 😊

On Android, this release mainly brings Chromecast feature, but it also repairs some lacks in priors versions. VLC on Android becomes more complete and it will continue!


Stop vertical videos now! Turn your phone horizontally when you record your children, because you’re going to show them to the family on the big screen now 📺

Chromecast support is finally here. As soon as a Chromecast is detected by VLC, you can send it a video or audio media and enjoy watching it!
If media codecs are supported by your Chromecast device, VLC only acts as a streaming server (which is battery consuming). If not, VLC will transcode and stream media, which is highly cpu and battery consuming.

Chromcast remote

Please consider Chromecast support beta for now, we will work on hardening it in the upcoming weeks thanks to your feedbacks.

VLC everywhere

VLC for Android is also available on different Android platforms like DeX, Chromebooks and Android auto.


You can now drop media files on VLC from other applications and use the right click on VLC media to get the context menu.

Chrome OS

Android Auto allows you to easily command VLC with a simplified UI or even by voice while driving. You can ask “play Daft Punk (with VLC)” and Google Assistant will recognize whether it’s an artist, an album or a song you’re asking for and tell VLC to play it.

auto player

Playlist files

Version 2.5 suffered from a painful regression: The lack of playlist file support. This was due to the migration to our new multiplatform medialibrary. This is now fixed with this update, VLC can scan your .m3u again and show your playlists.

Features Catch-Up

Delete is back

VLC 2.5 had troubles dealing with delete on internal storage on Oreo, this is now resolved and new permissions access is well managed.

But the big news is the support of media deletion on external devices for Android Lollipop+ device. All you have to do is to select the sdcard/USB key in the awful Google dialog and then VLC can delete any file in it!
For this special process, we prepared a small tutorial in the app which looks like this: sdcard wizard

Fast seek

‘Fast seek’ VLC option is now activated by default. VLC will now load faster when you change the current position during media playback. This can be deactivated in Settings → Video → ‘Enable fast seek option’

Subs (not) auto-loading

Not everyone wants subtitles, and we did not focus on this because most of the VideoLAN developers are European. But now you can deactivate automatic subtitles loading in Settings → Subtitles → ‘Auto load subtitles’.

Enjoy your videos without distraction now!

Why chromecast support took so long

Chromecast support is everywhere and VLC took years to get it, right, but there are plenty of good reasons for it:

First of all, VideoLAN is a nonprofit organization and not a company. There are few developers paid for making VLC, most of them do it in their free time. That’s how you get VLC for free and without any ads!

Also, VLC is 100% Open Source and Chromecast SDK isn’t: We had to develop our very own Chromecast stack by ourselves. This is also why there is no voice actions for VLC (except with Android Auto), we cannot use Google Play Services.

Furthermore, Chromecast is not designed to play local video files: When you watch a Youtube video, your phone is just a remote controller, nothing more. Chromecast streams the video from
That’s where it becomes complicated, Chromecast only supports very few codecs number, let’s say h264. Google ensures that your video is encoded in h264 format on, so streaming is simple.
With VLC, you have media of any format. So VLC has to be a http server like, and provide the video in a Chromecast compatible format. And of course in real time, which is challenging on Android because phones are less powerful than computers.

At last, VLC was not designed to display a video on another screen. It took time to properly redesign VLC to nicely support it. The good news is we did not make a Chromecast specific support, it is generic renderers: in the next months we can add UPnP support for example, to cast on any UPnP box or TV!

February 09, 2018 12:00 AM

December 14, 2017

Update on crypto-currency donations at VideoLAN

Ludovic Fauvet

After receiving much requests, the VideoLAN organization finally started accepting Bitcoin donations in February 2014. Since then, we received around 12 BTC. During the past year, the price skyrocketed and today we still hold more than 10 BTC. This unexpected surge of the Bitcoin market price makes it difficult to HODL securely. The volatility adding up to the processing time makes it quite impractical to spend.

The introduction of the Bitcoin whitepaper by Satoshi Nakamoto in 2008 was an amazing breakthrough and is already reshaping the future of payments and banking as a whole but we don’t think BTC (and derivatives) will be the de facto crypto-currency the world will use for daily transactions.

One of the key reason is the transparency of the Bitcoin blockchain. Our donation address being publicly available, the wealth we hold can be easily tracked between addresses and that makes us vulnerable. In the crypto-currency world you are your own bank, therefore you can become a target as soon as you hold enough money. No one else besides you can protect your funds from being stolen using a virtual, or even physical attack. And we don’t want any of our community members to be harmed because of that. We truly think privacy of the blockchain cannot be optional. Encrypting all transaction details: sender, receiver and amount is the most effective way to protect the people in a crypto-currency era.

Also, because of this blockchain transparency, all coins exchanged are not equal. You may think that 1 BTC = any other BTC but let me tell you, this is a wrong assumption. Imagine for a second that you received a payment containing a coin that was previously used (many transactions ago) to trade “stuff” on Silkroad, your coin is now forever tainted and might not be accepted on exchanges or payment processors. This lack of fungibility can make some of your money worth nothing, or worse, you could even be accused of money laundering.

Another major issue we experienced with Bitcoin is the processing time. Anyone dealing with BTC these days can attest that doing a payment is a pain and can easily take hours if not days. Especially if you have a lot of small inputs (like we do). Sending some random amount can costs us more than $100 in fees and can still take days to be processed. We usually end up using a free tx accelerator in order to speed things up. And we’re not alone in this space, few days ago Steam published a blog post saying they are no longer accepting Bitcoin payments for these reasons.

Let’s be honest, it’s the golden age of crypto-currencies: new crypto are launched every day and many of the people investing are betting for huge gains while most don’t care, or are just fooled, about what the technology can effectively bring. But in the end, maybe five years from now, there will only be a handful amount of crypto widely adopted. To be qualified as a possible winner, there are some characteristics to look for:

  • Must be fully open-source
  • Trusted development team
  • Active and sane community
  • Solid technological grounds
  • Scalable while maintaining low fees
  • Private and secure
  • Fungible
  • User-friendly (mobile, hardware wallets, …)
  • Out of pre-mining / ICO / scam

Let me reassure you, we are not yet to a point where we think of launching our own ICO, but if we were about to, we would definitely call it the ConeCoin! ;-)

We believe that there is still no perfect crypto-currency and we’re still quite far from it but we think that one is more in line with our core values and fits most of the critical points raised above: Monero.

Therefore, starting on January 1st, 2018, we will officially support donations in Moneroj (= plural of Monero).

We’re not yet to a point where we’ll stop accepting Bitcoin donations but we think Bitcoin became more a store of value than digital cash and we hope to see more individuals, open-source projects and stores to accept Monero in the future.

Of course, 99% of the donations we receive are still made with fiat money and that’s how we pay for servers, travels, meetings, conferences, hardware, goodies, … and we cannot thank our donators enough for their support!

VLC 3.0 is about to be released and if you too, want to support the VideoLAN project, head to our donation page (soon with Monero though!).

December 14, 2017 03:23 PM

October 02, 2017

Announcing VLC 2.5 release!

Geoffrey Métais

VLC is back on Play Store! Version 2.0 is more than 1 year old and will leave room for 2.5 which brings very interesting evolutions!

VLC for Android releases have been trapped in VLC 3.0 preparation and big media library refactoring black holes. So, there hasn’t been any update for 13 months, but development is still active and cool new stuff is coming!

This post will focus on features, implementations will be detailed in other blog posts (like the DiffUtil intro).

For now, let me introduce you to the new VLC for Android.

Minimum Android version is now Gingerbread.
FroYo support has been abandonned, these devices cannot access Google Play Store anymore.

UX evolutions

New dynamic UI

Video cards have been refactored, we now show you video details over its cover picture. This is a nicer presentation and gives room for displaying more videos at once.

Audio lists have been slightly lifted too. Others lists view have been reworked, like audio media, browsers and history. We got rid of cardview pattern, and got back to a more flat and clean design.

You can now select multiple items at the same time, to start a playlist for example.

Sort options have been spread to Audio and Browser sections.

Info page has also been redesigned with a fancy collapse effect for thumbnail or cover.

According to Material design principles, application has also become a bit more dynamic.

video grid

songs scrolling

New Audio Player Style

Audio player background is now a blurred version of current art cover if available.

player list player cover

Picture-In-Picture mode

VLC implements PiP support for Oreo devices and even Nougat Android TVs. You can activate it from video advanced options during playback.

We also added an option to automatically continue video playback in PiP or background mode (audio only) while multitasking.
Go in VLC settings to activate it and video playback will switch to PiP when you’ll press HOME button.

player cover

Android TV

TV interface had its own minor lifting too. Background is filled with blurred covers and colors are warmer. Also I made long media titles scroll, I heard your (justified) frustration :)

video grid

audio player

Android Auto

This release will bring Android Auto compatibility.
You’ll be able to use VLC as your travel music player with easy browsing into you audio library, with the minimum possible distraction from driving.

auto player

auto menu

VLC also supports voice actions on Android Auto:
You can ask “play Daft Punk (with VLC)” and Google Assistant will recognize whether it’s an artist, an album or a song you’re asking for and command VLC to play it.

auto voice

Chrome OS support

VLC has been tested and adapted for latest Chrome OS running Android apps. You now have an awesome media application ready for your chromebook!

Chrome OS

360° Videos support

VLC now supports 360° videos, you can change viewpoint by swiping or with remote control arrows.

video 360

Cardboard/VR mode is not available yet but we are working on it.


Search has been split in two modes:

  • First step, the text you type in triggers a filtering in the current view. Exactly like in current playlist view.
  • If you want to do a global search, click on the SEARCH IN ALL MEDIALIBRARY button to show the new search view. This will bring detailed results grouped by video/artist/album/songs/genres/playlist.

search global

Bonus: VLC is now compatible with voice search.
Asking Google Now “Search Artic Monkeys in VLC” will trigger a Arctic Monkeys search and show you this new search result screen.

search voice

Miscellaneous new features

  • DayNight mode integration
  • Audio boost in video
  • Equalizer custom presets
  • Save and resume position for podcasts & audiobooks
  • Restored double/long click on remote play to skip songs
  • Removed sound lowering on notification
  • Force previous song on audioplayer swipe
  • Fix audioplayer layout for black theme and RTL
  • Save subtitles delay and optionally audio delay for each file.
  • Support for devices with large aspect ratio, like G6 and S8 phones

Under the hood


That’s the most important change in this update, because it affects the whole application, but you should barely notice it…

VLC now uses medialibrary like VLC for Tizen (other VLC ports will follow).
It’s a C++ library, written by Hugo Beauzée-Luyssen, which parses storages for video/audio files and manages a sqlite database to model your media library (with album, artist, genre classification, etc..). It replaces the old system we had on Android which just saved media files with their metadata, we had no proper structure for media library.
Categories lists are now faster to show up, we don’t have to generate them at runtime. And this is all native code, which is faster than Java.
Beside this speed improvement, one of the main benefits of this medialibrary is to provide better search results.

For now we are focusing on the first scan performance to make it at least as fast as the previous system.

So, this library is aimed to be a common module of all VLC ports, wich means all debugging, performance and any improvement will benefit other platforms.

Next steps for this library will be media scrapping, and network scan:

  • Medialibrary will get information and illustrations for your media, so we’ll be able to present you a nice collection instead of an uncheerful files list. We will also group media by shows/seasons et genre/release year/whatever
  • You will be able to scan your NAS content to access your media easily.

This will make VLC a fully featured media center!

Playback performance & formats support

VLC core team worked hard too to bring performance improvements and some new features. Here are some highlights:

  • Adaptive (HLS/Dash) & TS playback improved
  • OpenGLES 2.0 is now used to render video (for software decoders & mediacodec)
  • Support for VP8/9/10 in MP4
  • HDMI passthrough


We also plan to implement a feature to download media on your device, in order to sync your series episodes or songs from your NAS to your device.

We’d like to support videos playlists like we do with videos grouped by their common name prefix.

As previously stated, medialibrary will help VLC to turn into a real media center with fancy movies/tv shows presentation, and better artists/albums artworks.

At last, I started an extension API to help everyone eager to develop android applications that can provide content to VLC, and benefit from VLC Auto and TV implementation. As a start, we will release (with sources of course) extensions for podcasts subscriptions and Google Drive access.

October 02, 2017 12:00 AM