Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основные возможности
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
В уроке савсем ничего не сказано как регулировать громкость, можно потратить часы на поиски нужной информации по темеhttp://stackoverflow.com/questions/5215 ... e-function
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
Такое дело:
Создаю программу для воспроизведения онлайн стримов с сайта Twitch.tv. Видео воспроизвожу через VideoView и оно нормально воспроизводится на телефонах, если же видео не воспроизводится по причине высокого разрешения, то воспроизвожу видео через WebView (с этим проблем также нет). Но на планшетах, вроде Nexus 7 или Nexus 10, где оно вроде бы должно нормально воспроизводиться - проигрывается лишь 2-3 секунды после чего в логах всплывают Error (1000, 0) и Error (-38, 0)
ссылка на видео имеет следующий вид:
Подскажите, с чем это может быть связано и как это можно решить?
Создаю программу для воспроизведения онлайн стримов с сайта 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
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
А media player не работает с playlist`ами ?
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
а возможно играть всю папку c sd
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
Урок получился - действительно только самые основные возможности(
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
урок преполгает, что далее вы будете изучать документацию...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...
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
ЧТО ЭТО ???
В первой части ты куда то пытаешься вывести список фалов папки ?
Во второй части ты намерен проиграть файл music.mp3 ?
Я всё правильно понял ?))
В первой части ты куда то пытаешься вывести список фалов папки ?
Во второй части ты намерен проиграть файл music.mp3 ?
Я всё правильно понял ?))
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
IgNa писал(а):ЧТО ЭТО ???
В первой части ты куда то пытаешься вывести список фалов папки ?
ДА. я не пытаюсь я тебе явно показал что у вас в windows есть dir которая показывает список фалов в папке, такое есть и в Android и java это умеет...а возможно играть всю папку c sd
ВОРПОС: чем куда -то выведенный список файлов в папке отличается от playlist ?????
ДА.как и любой другой файл из папи который ранее куда -то выводил....Во второй части ты намерен проиграть файл music.mp3 ?
ДА. если слово понял к собственному впоросу тут вообще уместноЯ всё правильно понял ?))
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
если простое объяснение принципа по которому это происходит вне зависимости от платформы и языка программирования не понятно, можно посмотреть, как вместо списка файлов в дирректории используется курсор и вообще, как это делается сегодня можно посмотреть тут: https://github.com/android/platform_pac ... roid/music
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
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)
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
String[] FilesNames; у тебя объявлен, но не инициализирован(хотя я подробно не смотрел что у тебя там), вообще массивы в java -это отдельная тема, лучше использовать что то вродеIgNa писал(а):altwin, у меня не получается перекачать файлы из папки в строковый массив почему то
[syntax=java5]
ArrayList<String> FilesNames = new ArrayList<String>();
// тут какие -то действия
FilesNames.add(allpath);
[/syntax]
Смысл в том, что массив не изменяемая структура и с ним нужно аккуратно общаться, а ArrayList тот же - более гибкий. Еще лучше подошла бы HashMap к примеру, т.е. ты можешь ключем хранить имя файла, а в значении путь к нему.
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
твой метод мне не подошел, так как он в логи вместо путей true выводил)))
я инициализировал свой, такой строкой allpath = new String[15];
мне конечно надо что бы он был бесконечным, но я не знаю как это сделать поэтому написал число членов к примеру 15
В результате по клику на папку в листвью, я перекачиваю все пути mp3 файлов от туда в свой массив.
Осталось додуматься как этот массив теперь перекинуть в Servicе и там по очереди оттрахать.
воспроизвести)
я инициализировал свой, такой строкой allpath = new String[15];
мне конечно надо что бы он был бесконечным, но я не знаю как это сделать поэтому написал число членов к примеру 15
В результате по клику на папку в листвью, я перекачиваю все пути mp3 файлов от туда в свой массив.
Осталось додуматься как этот массив теперь перекинуть в Servicе и там по очереди оттрахать.
воспроизвести)
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
Раньше я вот этим кодом передовал строку в Service
А теперь надо array ) Ужас
В любом случае спаибо, мишка Гамми
Код: Выделить всё
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);
В любом случае спаибо, мишка Гамми
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
Попытка передать array в Service
В Активити
В Service что то не то
Кажись все работает))) осталось бесконечный array научится инициализировать и придумать как проигрывать все файлы из array - вроде не сложно
В Активити
Код: Выделить всё
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();
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
Непоняточка.
В основной активити я создаю строковой массив из содержимого папки
смотрю логи - в нём все пути есть
Передаю этот массив в service через интент ( смотрю логи - тоже всё есть)
Ставлю mPlayer.setOnCompletionListener(this);
пытаюсь загрузить строку из массива - смотрю логи - а массив то уже пустой((
Как он так опустил ? если он объявлен и инициализирован
Объявлен в начале service
String[] allpath;
Инициализирован по создание Service
public void onCreate (){
super.onCreate();
allpath = new String[95];
Help\
В основной активити я создаю строковой массив из содержимого папки
смотрю логи - в нём все пути есть
Передаю этот массив в service через интент ( смотрю логи - тоже всё есть)
Ставлю mPlayer.setOnCompletionListener(this);
пытаюсь загрузить строку из массива - смотрю логи - а массив то уже пустой((
Как он так опустил ? если он объявлен и инициализирован
Объявлен в начале service
String[] allpath;
Инициализирован по создание Service
public void onCreate (){
super.onCreate();
allpath = new String[95];
Help\
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
он не инициализирован за пределами метода onCreate. Как я уже говорил лучше использовать [syntax=java5]IgNa писал(а):ъявлен и инициализирован
Объявлен в начале service
String[] allpath;
Инициализирован по создание Service
public void onCreate (){
super.onCreate();
allpath = new String[95];
Help\
ArrayList<String> allpath = new ArrayList<String>();
...
onCreate() {
...
allpath.add("строка")
}
[/syntax]
опять же надо весь код видеть, если делаешь это в background, не факт что он получает значение на тот момент, когда ты его вызываешь. Можно внутри местода onCreate просто использовать функцию, которая будет его возвращать и обращаться к ней.
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
И такие прибавки вроде слова public не помогут ему быть доступным всегда и везде в service ? (
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
public -это модификатор доступа. У тебя переменная не смотря на то, что созданна в классе - не инициализированна, когда ты ее инициализируешь в методе, она локальна для него, поскольку onCreate ничего не возвращает. Но вообще если ты создашь массив нужно размера именно там где создаешь переменную то все будет доступно, вот только придут ли туда данные из метода уже другой вопросIgNa писал(а):И такие прибавки вроде слова public не помогут ему быть доступным всегда и везде в service ? (
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
altwin, ты хочешь сказать что нету способа так объявить и инициализировать мой старый массив allpath = new String[95];
что бы он после формирования в Service был доступен всем методам в Service
И надо переделывать весь код - переходя на совершенно не понятный мне ArrayList<String> allpath = new ArrayList<String>();
что бы он после формирования в Service был доступен всем методам в Service
И надо переделывать весь код - переходя на совершенно не понятный мне ArrayList<String> allpath = new ArrayList<String>();
Re: Урок 126. Медиа. MediaPlayer – аудио/видео плеер, основн
ArrayList<String> - это просто более удобноы и гибкое средство чем простой массив и сним определенно стоит познакомится( http://stackoverflow.com/questions/1409 ... ring-array ). Но если ты сделаешь так:IgNa писал(а):altwin, ты хочешь сказать что нету способа так объявить и инициализировать мой старый массив allpath = new String[95];
что бы он после формирования в Service был доступен всем методам в Service
И надо переделывать весь код - переходя на совершенно не понятный мне ArrayList<String> allpath = new ArrayList<String>();
[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 отработал - данные полученны.