How to get local video Uri for ExoPlayer 2.x - android

I have a dog.mp4 video file in res/raw folder, which I want to play with ExoPlayer. I'm trying to figure out how to get video Uri for this line of code from ExoPlayer developers guide (https://google.github.io/ExoPlayer/guide.html):
MediaSource videoSource = new ExtractorMediaSource(mp4VideoUri,
dataSourceFactory, extractorsFactory, null, null);
To get it, I use this line:
Uri mp4VideoUri = Uri.parse("android.resources://"+getPackageName()+"/"+R.raw.dog);
Also tried this syntax: android.resource://[package]/[res type]/[res name]
But SimpleExoPlayerView stays black and I get following error:
com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException: Unable to connect to android.resources://lt.wilkas.deleteexoplayer/2131099648
What am I doing wrong?

Don't move your videos from raw to any another folder
Use this code to play video:
PlayerView playerView = findViewById(R.id.player_view);
SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance(this);
// Bind the player to the view.
playerView.setPlayer(player);
// Produces DataSource instances through which media data is loaded.
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "yourApplicationName"));
// This is the MediaSource representing the media to be played.
MediaSource firstSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(RawResourceDataSource.buildRawResourceUri(R.raw.dog));
// Prepare the player with the source.
player.prepare(firstSource);

According to ExoPlayer 2.12 its even easier to use MediaItem.
To create it we need Uri that could be generated from RawResourceDataSource.buildRawResourceUri.
And that's it. Just set this MediaItem do prepare() and play when ready:
SimpleExoPlayer.Builder(view.context).build().apply {
val uri = RawResourceDataSource.buildRawResourceUri(R.raw.video)
setMediaItem(MediaItem.fromUri(uri))
prepare()
playWhenReady = true
}

I've found out that res/raw folder cant be used to store local videos for ExoPlayer. They should be placed in assets folder.

res/raw folder can be used to access local video file for ExoPlayer via it's URI. Here's the solution that will not give the Malformed URL exception and it works for me. You have to use RawResourceDataSource.buildRawResourceUri(R.raw.video) method of the RawResourceDataSource class. Keep in mind that i used the 2.8.0 version of ExoPlayer.
public class MainActivity extends AppCompatActivity {
PlayerView playerView;
SimpleExoPlayer simpleExoPlayer;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playerView=findViewById(R.id.playerView);
}
#Override
protected void onStart() {
simpleExoPlayer= ExoPlayerFactory.newSimpleInstance(this,new DefaultTrackSelector());
DefaultDataSourceFactory defaultDataSourceFactory=new DefaultDataSourceFactory(this, Util.getUserAgent(this,"yourApplicationName"));
simpleExoPlayer.setPlayWhenReady(true);
ExtractorMediaSource extractorMediaSource=new ExtractorMediaSource.Factory(defaultDataSourceFactory).createMediaSource(RawResourceDataSource.buildRawResourceUri(R.raw.video));
simpleExoPlayer.prepare(extractorMediaSource);
playerView.setPlayer(simpleExoPlayer);
super.onStart();
}
#Override
protected void onStop() {
playerView.setPlayer(null);
simpleExoPlayer.release();
simpleExoPlayer=null;
super.onStop();
}
}

here is the sample to load video/audio file from res/raw with ExoPlayer :
val player = ExoPlayerFactory.newSimpleInstance(context,DefaultTrackSelector())
val rawDataSource = RawResourceDataSource(context)
rawDataSource.open(DataSpec(RawResourceDataSource.buildRawResourceUri(R.raw.brown)))
val mediaSource = ExtractorMediaSource.Factory(DataSource.Factory { rawDataSource })
.createMediaSource(rawDataSource.uri)
player.playWhenReady = true
player.prepare(mediaSource)
sample copied from

This code works for me.
fun buildMediaSourceRaw() : MediaSource{
val dataSourceFactory = DefaultDataSourceFactory(context, "exoPlayer")
val uri = RawResourceDataSource.buildRawResourceUri(R.raw.my_video)
return ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(uri)
}
Then
player?.prepare(buildMediaSourceRaw())

Related

Delay in start of play music in SimpleExoPlayer android

I am building Music App in which I have uploaded music on firebase. I am using SimpleExoPlayer and PlayerView to run the music. The problem is when I click on the music, the music start after 10 seconds or more. I search it but did not find any solution
ExoPLayer library:
implementation "com.google.android.exoplayer:exoplayer:2.14.1"
public void initPlayer(MusicModel dataModel) {
if (playerLayout.getVisibility() == View.GONE && !isFullScreenOn) {
playerLayout.setVisibility(View.VISIBLE);
}
assignPlayerLayout(dataModel);
assignFullScreenPlayerLayout(dataModel);
try {
playerView.setControllerShowTimeoutMs(0);
playerView.setCameraDistance(10);
playerView.setShowFastForwardButton(false);
playerView.setShowRewindButton(false);
playerView.setShowNextButton(false);
playerView.setShowPreviousButton(false);
playerView.setShutterBackgroundColor(R.color.white);
simpleExoPlayer = new SimpleExoPlayer.Builder(MainActivity.this).build();
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setUsage(C.USAGE_MEDIA)
.setContentType(C.CONTENT_TYPE_MOVIE)
.build();
simpleExoPlayer.setAudioAttributes(audioAttributes, true);
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(MainActivity.this,
Util.getUserAgent(MainActivity.this, getResources().getString(R.string.app_name)));
MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(getString(dataModel.getAudioFile())));
playerView.setPlayer(simpleExoPlayer);
simpleExoPlayer.seekTo(0);
// Tell it to play the sound
simpleExoPlayer.prepare(mediaSource);
simpleExoPlayer.setPlayWhenReady(true);
isPlaying = true;
}catch (Exception e){
Log.e("except",e.toString());
}
}
Please give me a solution
Blockquote
, I shall be very thankful to you.

Play Linear Inline Ads Every 5 Min in ExoPlayer with IMA extension

I am Very Beginner in Exoplayer with IMA, I am creating Video player with Exoplayer and IMA extension. I Created Exoplayer using https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side
Its Play ads only one time. But I want to play Linear Inline ads every 5 mins. I tried How to show ads at specific points using ExoPlayer's IMA extension?
Uri adTagUri = Uri.parse(getString(R.string.ad_tag_url));
AdPlaybackState adPlaybackState = new AdPlaybackState(0, 300 * C.MICROS_PER_SECOND);
// add the uri of the first ad of the first ad group
adPlaybackState = adPlaybackState.withAdUri(0, 0, adTagUri);
// add the uri of the first ad of the second ad group
adPlaybackState = adPlaybackState.withAdUri(1, 0, adTagUri);
// add the uri of the second ad of the second ad group
adPlaybackState = adPlaybackState.withAdUri(1, 1, adTagUri);
Got error in eventListener.onAdPlaybackState(adPlaybackState);
My Lib implementation 'com.google.android.exoplayer:extension-ima:2.11.1'
MyCode
MainActivity.java
private PlayerView playerView;
private SimpleExoPlayer player;
private ImaAdsLoader adsLoader;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playerView = findViewById(R.id.player_view);
adsLoader = new ImaAdsLoader(this, Uri.parse(getString(R.string.ad_tag_url)));
}
private void releasePlayer() {
adsLoader.setPlayer(null);
playerView.setPlayer(null);
player.release();
player = null;
}
private void initializePlayer() {
// Create a SimpleExoPlayer and set it as the player for content and ads.
player = new SimpleExoPlayer.Builder(this).build();
playerView.setPlayer(player);
adsLoader.setPlayer(player);
DataSource.Factory dataSourceFactory =
new DefaultDataSourceFactory(this, Util.getUserAgent(this, getString(R.string.app_name)));
ProgressiveMediaSource.Factory mediaSourceFactory =
new ProgressiveMediaSource.Factory(dataSourceFactory);
MediaSource mediaSource =
mediaSourceFactory.createMediaSource(Uri.parse(getString(R.string.content_url)));
AdsMediaSource adsMediaSource =
new AdsMediaSource(mediaSource, dataSourceFactory, adsLoader, playerView);
player.prepare(adsMediaSource);
player.setPlayWhenReady(false);
}
Help me to Complete Code

Exoplayer 2.12, dose not load local subtitles

Even after going through many questions on Stackoverflow and other threads we could not find any solution for the subtitle issue in Exoplayer.
Following is the code snippet we are using to load video and subtitle from local storage.
public void setVideo(String absolutePath, String vtt){
player = new SimpleExoPlayer.Builder(this).build();
videoView.setPlayer(player);
// MediaItem mediaItem = MediaItem.fromUri(absolutePath);
MediaItem.Subtitle subtitle = new MediaItem.Subtitle(Uri.parse(vtt),MimeTypes.TEXT_VTT,"en-US");
List<MediaItem.Subtitle> subtitleList = new ArrayList<>();
subtitleList.add(subtitle);
videoView.setShowSubtitleButton(true);
MediaItem mediaItem = new MediaItem.Builder()
.setUri(absolutePath)
.setDrmUuid(C.WIDEVINE_UUID)
.setDrmMultiSession(true)
.setSubtitles(subtitleList)
.build();
player.setMediaItem(mediaItem);
player.setPlayWhenReady(true);
player.prepare();
}
Here absolutePath is path to the video and vtt is the path to .srt subtitle file.
We would really appreciate any suggestions or alternative way to achieve this.

How to re-add a mediasource after the exoplayer has been prepared?

I'm creating a playlist video player in exoplayer in android studio. I'm adding the first video extracted from a server and it is being played by the exoplayer perfectly. But when I add the second part, the exoplayer does not play that video. I want to add the second video after the exoplayer has been prepared. I want to know how to do that. Please Help me.
My MainActivity.java:
public class MainActivity extends AppCompatActivity
{
SimpleExoPlayer video_player;
PlayerView player_screen;
DefaultTrackSelector track_selector;
DefaultBandwidthMeter band_width_meter = new DefaultBandwidthMeter();
ArrayList<MediaSource> mediaSources_contents = new ArrayList<>();
ConcatenatingMediaSource concatenating_mediaSource_contents;
#Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
player_screen = (PlayerView) findViewById(R.id.player_screen);
player_screen.requestFocus();
TrackSelection.Factory video_track_selection_factory = new AdaptiveTrackSelection.Factory(band_width_meter);
track_selector = new DefaultTrackSelector(video_track_selection_factory);
video_player = ExoPlayerFactory.newSimpleInstance(this, track_selector);
player_screen.setPlayer(video_player);
video_player.setPlayWhenReady(true);
Uri url1 = Uri.parse("THE - URL - OF - FIRST - VIDEO");
DataSource.Factory data_source_factory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "Application Name"), band_width_meter);
MediaSource source1 = new ExtractorMediaSource.Factory(data_source_factory).createMediaSource(url1);
mediaSources_contents.add(source1);
concatenating_mediaSource_contents = new ConcatenatingMediaSource(mediaSources_contents.toArray(new MediaSource[mediaSources_contents.size()]));
video_player.prepare(concatenating_mediaSource_contents);
// The lines below this point adds the second video to the media source. But it is not being played by the exoplayer.
Uri url2 = Uri.parse("THE - URL - OF - SECOND - VIDEO");
MediaSource source2 = new ExtractorMediaSource.Factory(data_source_factory).createMediaSource(url2);
mediaSources_contents.add(source2);
}
}
At Prepared Time
Initialize ConcatenatingMediaSource
ConcatenatingMediaSource mediaSource = new ConcatenatingMediaSource();
MediaSource firstSource = new ProgressiveMediaSource.Factory(new FileDataSourceFactory()).createMediaSource(Uri.parse(uri.get(0)));
MediaSource secondSource= new ProgressiveMediaSource.Factory(new FileDataSourceFactory()).createMediaSource(Uri.parse(uri.get(1)));
mediaSource.addMediaSources(firstSource);
mediaSource.addMediaSources(secondSource);
player.prepare(mediaSource, true, false);
After Prepare Add mediasource
MediaSource thirdSource= new ProgressiveMediaSource.Factory(new FileDataSourceFactory()).createMediaSource(Uri.parse(uri.get(3)));
mediaSource.addMediaSources(thirdSource);// mediaSource is refrance of ConcatenatingMediaSource
Try add this concatenating_mediaSource_contents.addMediaSource(source2); instead mediaSources_contents.add(source2);and for first media source also (not necessary, for better readability)

Stream AAC on Android

I'm working on an app for a client that requires streaming of an AAC audio stream. Unfortunately, there's nothing I can do about the stream format on the server. I'm working on Android and have discovered that Android's media player does not support raw AAC streams (which is what I'm getting). I found a project on Google Code that supports it (I tested it with the stream) but it's GPL'ed and that doesn't work for my client. I don't have much experience with this sort of thing so forgive me if my ideas aren't great. I know Android can play AAC encoded content if it is in an MP4 wrapper so I had thought about creating an MP4 wrapper on the fly on the client-side or perhaps even just doing some conversion to another format on the fly. Are these reasonable options? Does anybody have better suggestions?
Thanks in advance!
Edit To rephrase, is it possible to put a raw AAC stream from a web server in an MP4 container in real time? If so, does anybody know of resources to help me with the process?
I'm wondering if you ever came up with a solution for this problem? I'm in a similar situation. We have a web service generating AAC files, though not raw, they have the ADTS header. Android 2.2 can't play these files, though android 2.1 can, oddly enough. It seems to be a problem rooted to android switching to stagefright libraries for media playback in 2.2.
The AAC files do play fine when wrapped in an MP4 container. We've accomplish this on the server side very easily using FAAC (I realize this doesn't help you in your situation). We are still investigating licensing issues with using an mp4 container though. Does this require royalties?
To answer my own question...a lawyer has confirmed that using an mp4 container for an AAC file does not require licensing.
I TRIED ACCDECODER by Google for 4 motnhs it did work well. I found it and in 2 days I could did it works! :) I found it and saw it on the last Google I/O 2017
I can suggest to use EXOPLAYER INSTEAD MEDIAPLAYER. It is a better and improve way. I had the same problem using just MediaPlayer, but short time ago I found Exoplayer, now I do not have problem to Play audio streaming Acc, mp3, mpeg, etc. I can give a couple links to check it.
ExoPlayer is an open source project that is not part of the Android framework and is distributed separately from the Android SDK. ExoPlayer’s standard audio and video components are built on Android’s MediaCodec API, which was released in Android 4.1 (API level 16). Because ExoPlayer is a library, you can easily take advantage of new features as they become available by updating your app.
ExoPlayer supports features like Dynamic adaptive streaming over HTTP (DASH), SmoothStreaming and Common Encryption, which are not supported by MediaPlayer. It's designed to be easy to customize and extend.
This is almost the same like MediaPlayer because Exoplayer extend from it. You can see a lot of differences and an easy way to implement it. If you need more help let me know :)
For example you have this:
Media Player mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource("http://your.url.com"); //add you url address
...
mediaPlayer.prepare();
mediaPlayer.start();
In Exoplayer you need it:
// Create the player
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
simpleExoPlayerView = new SimpleExoPlayerView(this);
simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view);
//Set media controller
simpleExoPlayerView.setUseController(true);
simpleExoPlayerView.requestFocus();
// Bind the player to the view.
simpleExoPlayerView.setPlayer(player);
ExoPlayer example code:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private SimpleExoPlayerView simpleExoPlayerView;
private SimpleExoPlayer player;
private ExoPlayer.EventListener exoPlayerEventListener;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG,"portrait detected...");
setContentView(R.layout.activity_main);
// 1. Create a default TrackSelector
Handler mainHandler = new Handler();
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveVideoTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector = new DefaultTrackSelector(mainHandler, videoTrackSelectionFactory);
// 2. Create a default LoadControl
LoadControl loadControl = new DefaultLoadControl();
// 3. Create the player
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
simpleExoPlayerView = new SimpleExoPlayerView(this);
simpleExoPlayerView = (SimpleExoPlayerView) findViewById(R.id.player_view);
//Set media controller
simpleExoPlayerView.setUseController(true);
simpleExoPlayerView.requestFocus();
// Bind the player to the view.
simpleExoPlayerView.setPlayer(player);
//CHOOSE CONTENT: Livestream links may be out of date so find any m3u8 files online and replace:
//VIDEO FROM SD CARD:
// String urimp4 = "/FileName.mp4";
// Uri mp4VideoUri = Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+urimp4);
//yachts livestream m3m8 file:
Uri mp4VideoUri =Uri.parse("http://your.url.com");
//Random livestream file:
// Uri mp4VideoUri =Uri.parse("http://your.url.com");
//Sports livestream file:
// Uri mp4VideoUri =Uri.parse("http://your.url.com");
// Measures bandwidth during playback. Can be null if not required.
DefaultBandwidthMeter bandwidthMeterA = new DefaultBandwidthMeter();
//Produces DataSource instances through which media data is loaded.
// DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "exoplayer2example"), bandwidthMeterA);
DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(this, Util.getUserAgent(this, "exoplayer2example"), bandwidthMeterA);
//Produces Extractor instances for parsing the media data.
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
//This is the MediaSource representing the media to be played:
//FOR SD CARD SOURCE:
// MediaSource videoSource = new ExtractorMediaSource(mp4VideoUri, dataSourceFactory, extractorsFactory, null, null);
//FOR LIVESTREAM LINK:
MediaSource videoSource = new HlsMediaSource(mp4VideoUri, dataSourceFactory, 1, null, null);
final LoopingMediaSource loopingSource = new LoopingMediaSource(videoSource);
// Prepare the player with the source.
player.prepare(loopingSource);
player.addListener(new ExoPlayer.EventListener() {
#Override
public void onLoadingChanged(boolean isLoading) {
Log.v(TAG,"Listener-onLoadingChanged...");
}
#Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
Log.v(TAG,"Listener-onPlayerStateChanged...");
}
#Override
public void onTimelineChanged(Timeline timeline, Object manifest) {
Log.v(TAG,"Listener-onTimelineChanged...");
}
#Override
public void onPlayerError(ExoPlaybackException error) {
Log.v(TAG,"Listener-onPlayerError...");
player.stop();
player.prepare(loopingSource);
player.setPlayWhenReady(true);
}
#Override
public void onPositionDiscontinuity() {
Log.v(TAG,"Listener-onPositionDiscontinuity...");
}
});
player.setPlayWhenReady(true);
}//End of onCreate
#Override
protected void onStop() {
super.onStop();
Log.v(TAG,"onStop()...");
}
#Override
protected void onStart() {
super.onStart();
Log.v(TAG,"onStart()...");
}
#Override
protected void onResume() {
super.onResume();
Log.v(TAG,"onResume()...");
}
#Override
protected void onPause() {
super.onPause();
Log.v(TAG,"onPause()...");
}
#Override
protected void onDestroy() {
super.onDestroy();
Log.v(TAG,"onDestroy()...");
player.release();
}
}
It was a short example, If you are looking for something else or need more help let me know! I am here! I would like to help because I know how it feels when you are googling and searching and anything it is showing up! :) Take care!!

Categories

Resources