Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основные возможности

Обсуждение уроков
Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 01 фев 2014, 17:18

В уроке савсем ничего не сказано как регулировать громкость, можно потратить часы на поиски нужной информации по темеhttp://stackoverflow.com/questions/5215 ... e-function
Изображение

DVL999
Сообщения: 2
Зарегистрирован: 27 дек 2013, 18:53

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение DVL999 » 06 фев 2014, 12:23

Такое дело:
Создаю программу для воспроизведения онлайн стримов с сайта Twitch.tv. Видео воспроизвожу через VideoView и оно нормально воспроизводится на телефонах, если же видео не воспроизводится по причине высокого разрешения, то воспроизвожу видео через WebView (с этим проблем также нет). Но на планшетах, вроде Nexus 7 или Nexus 10, где оно вроде бы должно нормально воспроизводиться - проигрывается лишь 2-3 секунды после чего в логах всплывают Error (1000, 0) и Error (-38, 0)

ссылка на видео имеет следующий вид:

Код: Выделить всё

http://video7.sfo01.hls.twitch.tv/hls66/boppo_8457904928_61520751/chunked/index-live.m3u8?token=id=3429484797249157298,bid=8457904928,exp=1391765367,node=video7-1.sfo01.hls.justin.tv,nname=video7.sfo01,fmt=chunked&sig=cc998dfd3ff02f49e94f62e42e02fe45e41652c8

Код: Выделить всё

private void startWatchVideo(int position) {
		webViewVA.setVisibility(View.GONE);
		videoViewVA.setVisibility(View.VISIBLE);
		
		video_link = listVideoLinks.get(position);
		videoViewVA.setMediaController(new MediaController(this));
		videoViewVA.setVideoURI(Uri.parse(video_link));
		videoViewVA.requestFocus();
		
		videoViewVA.setOnPreparedListener(new OnPreparedListener() {
			public void onPrepared(MediaPlayer media) {
				mp = media;
				media.start();
			}
		});
		
		videoViewVA.setOnErrorListener(new OnErrorListener() {
			@Override
			public boolean onError(MediaPlayer mp, int what, int extra) {
				if (what == 1 || what == 100)
			    {
					videoViewVA.stopPlayback();
					startWatchWebview(real_name);
			    }
				
				return false;
			}
		});
		
		
	}

Код: Выделить всё

02-06 12:19:45.863: D/MediaPlayer(2171): Couldn't open file on client side, trying server side
02-06 12:19:54.962: D/MediaPlayer(2171): getMetadata
02-06 12:19:56.403: W/MediaPlayer(2171): info/warning (3, 0)
02-06 12:19:56.443: I/MediaPlayer(2171): Info (3,0)
02-06 12:19:58.335: W/AudioSystem(2171): AudioFlinger server died!
02-06 12:19:58.345: W/IMediaDeathNotifier(2171): media server died
02-06 12:19:58.345: E/MediaPlayer(2171): error (100, 0)
02-06 12:19:58.345: E/MediaPlayer(2171): Error (100,0)
02-06 12:19:58.345: D/VideoView(2171): Error: 100,0
02-06 12:19:58.345: E/MediaPlayer(2171): stop called in state 0
02-06 12:19:58.345: E/MediaPlayer(2171): error (-38, 0)
02-06 12:19:58.345: I/ServiceManager(2171): Waiting for service media.audio_flinger...
02-06 12:19:59.456: W/MediaPlayer(2171): mediaplayer went away with unhandled events
02-06 12:20:00.087: D/TilesManager(2171): Starting TG #0, 0x73b62910
02-06 12:20:00.087: D/TilesManager(2171): new EGLContext from framework: 73a16cb8 
02-06 12:20:00.087: D/GLWebViewState(2171): Reinit shader
02-06 12:20:00.157: D/GLWebViewState(2171): Reinit transferQueue
Подскажите, с чем это может быть связано и как это можно решить?

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 15 фев 2014, 10:57

А media player не работает с playlist`ами ?
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 15 фев 2014, 12:58

а возможно играть всю папку c sd
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 15 фев 2014, 13:00

Урок получился - действительно только самые основные возможности(
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение altwin » 15 фев 2014, 13:33

IgNa писал(а):Урок получился - действительно только самые основные возможности(
урок преполгает, что далее вы будете изучать документацию...
чтобы "играть" всю папку, что мешает выполнить итерацию по файлам в папке вроде:

[syntax=java5]public static void main(String... args) {
File[] files = new File("/").listFiles();
showFiles(files);
}

public static void showFiles(File[] files) {
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Directory: " + file.getName());
showFiles(file.listFiles()); // Calls same method again.
} else {
System.out.println("File: " + file.getName());
}
}
}[/syntax]

и воспроизвести:

[syntax=java5]String PATH_TO_FILE = "/sdcard/music.mp3";
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(PATH_TO_FILE);
mediaPlayer.prepare();
mediaPlayer.start()[/syntax]

что такое playlist? Это список путей к файлам, который вы составили...

P.S. обучение программированию -это не совсем "выучивание" common practice... ;)
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 15 фев 2014, 14:47

ЧТО ЭТО ???

В первой части ты куда то пытаешься вывести список фалов папки ?
Во второй части ты намерен проиграть файл music.mp3 ?
Я всё правильно понял ?))
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение altwin » 15 фев 2014, 14:53

IgNa писал(а):ЧТО ЭТО ???

В первой части ты куда то пытаешься вывести список фалов папки ?
а возможно играть всю папку c sd
ДА. я не пытаюсь я тебе явно показал что у вас в windows есть dir которая показывает список фалов в папке, такое есть и в Android и java это умеет...
ВОРПОС: чем куда -то выведенный список файлов в папке отличается от playlist ?????
Во второй части ты намерен проиграть файл music.mp3 ?
ДА.как и любой другой файл из папи который ранее куда -то выводил....
Я всё правильно понял ?))
ДА. если слово понял к собственному впоросу тут вообще уместно ;)
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение altwin » 15 фев 2014, 15:13

если простое объяснение принципа по которому это происходит вне зависимости от платформы и языка программирования не понятно, можно посмотреть, как вместо списка файлов в дирректории используется курсор и вообще, как это делается сегодня можно посмотреть тут: https://github.com/android/platform_pac ... roid/music
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 15 фев 2014, 18:56

altwin, у меня не получается перекачать файлы из папки в строковый массив почему то

Код: Выделить всё

Объявляю строковый массив вначале  программы           String[] FilesNames;

Далее в обработке нажатия на папку в листвью пишу:

int a=-1;   //'это потребуется для перелива путей к mp3-файлам в этот массив
String asd = ah.getGroupText(groupPosition);    // здесь я выясняю полное название папки 
String folder ="/mnt/sdcard/music/love/"+ asd; // здесь я выясняю полное название папки 


//Далее самое главное -  почему то не удается перенести пути ( которые легко и не принужденно выводятся в логи)
 в мой строковый массив 

 File[] files = new File(falder).listFiles();
                                	  
  for (File file : files) {
String allpath = folder + file.getName();
a=a+1;
                     		
 FilesNames[a]  =  allpath; 
   }

Еще логи положено показывать

Код: Выделить всё

02-15 19:59:53.069: E/AndroidRuntime(10811): FATAL EXCEPTION: main
02-15 19:59:53.069: E/AndroidRuntime(10811): java.lang.NullPointerException
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at om.example.jk.MainActivity$3.onGroupClick(MainActivity.java:142)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:543)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:521)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at android.widget.AbsListView$1.run(AbsListView.java:3168)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at android.os.Handler.handleCallback(Handler.java:605)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at android.os.Handler.dispatchMessage(Handler.java:92)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at android.os.Looper.loop(Looper.java:137)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at android.app.ActivityThread.main(ActivityThread.java:4424)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at java.lang.reflect.Method.invokeNative(Native Method)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at java.lang.reflect.Method.invoke(Method.java:511)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-15 19:59:53.069: E/AndroidRuntime(10811): 	at dalvik.system.NativeStart.main(Native Method)
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение altwin » 15 фев 2014, 21:44

IgNa писал(а):altwin, у меня не получается перекачать файлы из папки в строковый массив почему то
String[] FilesNames; у тебя объявлен, но не инициализирован(хотя я подробно не смотрел что у тебя там), вообще массивы в java -это отдельная тема, лучше использовать что то вроде
[syntax=java5]
ArrayList<String> FilesNames = new ArrayList<String>();
// тут какие -то действия
FilesNames.add(allpath);
[/syntax]
Смысл в том, что массив не изменяемая структура и с ним нужно аккуратно общаться, а ArrayList тот же - более гибкий. Еще лучше подошла бы HashMap к примеру, т.е. ты можешь ключем хранить имя файла, а в значении путь к нему.
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 15 фев 2014, 23:09

твой метод мне не подошел, так как он в логи вместо путей true выводил)))

я инициализировал свой, такой строкой allpath = new String[15];
мне конечно надо что бы он был бесконечным, но я не знаю как это сделать поэтому написал число членов к примеру 15

В результате по клику на папку в листвью, я перекачиваю все пути mp3 файлов от туда в свой массив.
Осталось додуматься как этот массив теперь перекинуть в Servicе и там по очереди оттрахать.
воспроизвести)
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 15 фев 2014, 23:16

Раньше я вот этим кодом передовал строку в Service

Код: Выделить всё

           bindService(new Intent(this,MusicService.class),  
                    Scon,Context.BIND_AUTO_CREATE);  
            mIsBound = true;      
 
         Intent music = new Intent();  
         music.setClass(this,MusicService.class).putExtra("musicfile", musicfile);  
         startService(music);  
             
             
А теперь надо array ) Ужас ;)
В любом случае спаибо, мишка Гамми
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 15 фев 2014, 23:42

Попытка передать array в Service
В Активити

Код: Выделить всё

                Bundle b=new Bundle();                                
                b.putStringArray("key", allpath);
      
            
                Intent music=new Intent(MainActivity.this, MusicService.class);
                music.putExtras(b);
                startService(music);  

В Service что то не то

Код: Выделить всё

public int onStartCommand (Intent intent, int flags, int startId)
	{
       	
    	String[] allpath=intent.getStringArrayExtra("key"); 
		musicfile = allpath[0];
    	try {
      	    mPlayer.stop();
    	}finally {
		
		}
        	
        	try {
        		mPlayer = new MediaPlayer();
	                mPlayer.setDataSource(musicfile);
			mPlayer.prepare();
	        	mPlayer.start();
Кажись все работает))) осталось бесконечный array научится инициализировать и придумать как проигрывать все файлы из array - вроде не сложно
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 16 фев 2014, 13:32

Непоняточка.
В основной активити я создаю строковой массив из содержимого папки
смотрю логи - в нём все пути есть

Передаю этот массив в service через интент ( смотрю логи - тоже всё есть)
Ставлю mPlayer.setOnCompletionListener(this);
пытаюсь загрузить строку из массива - смотрю логи - а массив то уже пустой((

Как он так опустил ? если он объявлен и инициализирован

Объявлен в начале service
String[] allpath;
Инициализирован по создание Service
public void onCreate (){
super.onCreate();
allpath = new String[95];


Help\
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение altwin » 16 фев 2014, 13:36

IgNa писал(а):ъявлен и инициализирован

Объявлен в начале service
String[] allpath;
Инициализирован по создание Service
public void onCreate (){
super.onCreate();
allpath = new String[95];


Help\
он не инициализирован за пределами метода onCreate. Как я уже говорил лучше использовать [syntax=java5]
ArrayList<String> allpath = new ArrayList<String>();
...
onCreate() {
...
allpath.add("строка")
}
[/syntax]
опять же надо весь код видеть, если делаешь это в background, не факт что он получает значение на тот момент, когда ты его вызываешь. Можно внутри местода onCreate просто использовать функцию, которая будет его возвращать и обращаться к ней.
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 16 фев 2014, 14:31

И такие прибавки вроде слова public не помогут ему быть доступным всегда и везде в service ? (
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение altwin » 16 фев 2014, 14:36

IgNa писал(а):И такие прибавки вроде слова public не помогут ему быть доступным всегда и везде в service ? (
public -это модификатор доступа. У тебя переменная не смотря на то, что созданна в классе - не инициализированна, когда ты ее инициализируешь в методе, она локальна для него, поскольку onCreate ничего не возвращает. Но вообще если ты создашь массив нужно размера именно там где создаешь переменную то все будет доступно, вот только придут ли туда данные из метода уже другой вопрос :)
Изображение

Аватара пользователя
IgNa
Сообщения: 345
Зарегистрирован: 30 сен 2013, 12:18

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение IgNa » 16 фев 2014, 15:01

altwin, ты хочешь сказать что нету способа так объявить и инициализировать мой старый массив allpath = new String[95];
что бы он после формирования в Service был доступен всем методам в Service

И надо переделывать весь код - переходя на совершенно не понятный мне ArrayList<String> allpath = new ArrayList<String>();
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн

Сообщение altwin » 16 фев 2014, 15:15

IgNa писал(а):altwin, ты хочешь сказать что нету способа так объявить и инициализировать мой старый массив allpath = new String[95];
что бы он после формирования в Service был доступен всем методам в Service

И надо переделывать весь код - переходя на совершенно не понятный мне ArrayList<String> allpath = new ArrayList<String>();
ArrayList<String> - это просто более удобноы и гибкое средство чем простой массив и сним определенно стоит познакомится( http://stackoverflow.com/questions/1409 ... ring-array ). Но если ты сделаешь так:
[syntax=java5]
String[] allpath = new String[95];
[/syntax]
и дальше будешь его заполнять - он будет доступен, но. Во первых это проблема, когда место в нем закончится. Но главное, у тебя же скорее всего код, который "заполняет" массив работает где то в background, а модель java потоков - не гаррантирует порядка выполнения и не факт, что при обращении к массиву нужные данные уже туда попадут. Тут вопрос не столько в том, где хранить строки, сколько в том, как это делать. Если в onCreate ты добавляешь что -то в массив - не делай этого. Создай метод к примеру onDataUpgrade в котором и выполняй вставку, метод возвращает нужный массив и ты просто вызываешь его там же. К примеру что то вроде:
[syntax=java5]
ArrayList<String> allpath = new ArrayList<String>();
...
onCreate() {
String data = dataStorage.getData().toString();
onDataUpgrade(data);
}

public ArrayList<String> onDataUpgrade(mData) {
...
return allpath.add(mData);
}

[/syntax]
далее же ты точно знаешь, если метод onDataUpgrade отработал - данные полученны.
Изображение

Ответить