MediaPlayer setDataSource, лучше использовать path или FileDescriptor?

Допустим, у меня есть полный путь к файлу. Какой лучший подход для загрузки этого файла в MediaPlayer?

String filePath = "somepath/somefile.mp3";
mediaPlayer.setDataSource(filePath);

ИЛИ ЖЕ

String filePath = "somepath/somefile.mp3";
File file = new File(filePath);
FileInputStream inputStream = new FileInputStream(file);
mediaPlayer.setDataSource(inputStream.getFD());
inputStream.close();

Это имеет значение? Простое использование пути кажется более простым, но есть ли причина проделать дополнительную работу для использования FileDescriptor?

 Jens08 мар. 2012 г., 23:04
FileDescriptor можно использовать при воспроизведении из контента сContentProvider или папку активов, например.

Ответы на вопрос(2)

которые принимают как строку (путь), так и FD. Они оба в конечном итоге идут в нативный C-код. Хотя один из них может быть НЕМНОГО более эффективным, он будет незначительным, если вы не устанавливаете свой источник данных чаще, чем раз в секунду.

/**
 * Sets the data source (file-path or http/rtsp URL) to use. Call this after 
 * reset(), or before any other method (including setDataSource()) that might
 * throw IllegalStateException in this class.
 * 
 * @param path the path of the file, or the http/rtsp URL of the stream you want to play
 * @throws IllegalStateException if it is called
 * in an order other than the one specified above
 */
public native void setDataSource(String path) throws IOException, IllegalArgumentException, IllegalStateException;

/**
 * Sets the data source (FileDescriptor) to use. It is the caller's responsibility
 * to close the file descriptor. It is safe to do so as soon as this call returns.
 * Call this after reset(), or before any other method (including setDataSource()) 
 * that might throw IllegalStateException in this class.
 * 
 * @param fd the FileDescriptor for the file you want to play
 * @throws IllegalStateException if it is called
 * in an order other than the one specified above
 */
public void setDataSource(FileDescriptor fd) 
        throws IOException, IllegalArgumentException, IllegalStateException {
    // intentionally less than LONG_MAX
    setDataSource(fd, 0, 0x7ffffffffffffffL);
}

/**
 * Sets the data source (FileDescriptor) to use.  It is the caller's responsibility
 * to close the file descriptor. It is safe to do so as soon as this call returns.
 * Call this after reset(), or before any other method (including setDataSource()) 
 * that might throw IllegalStateException in this class.
 * 
 * @param fd the FileDescriptor for the file you want to play
 * @param offset the offset into the file where the data to be played starts, in bytes
 * @param length the length in bytes of the data to be played
 * @throws IllegalStateException if it is called
 * in an order other than the one specified above
 */
public native void setDataSource(FileDescriptor fd, long offset, long length) 
        throws IOException, IllegalArgumentException, IllegalStateException;
 Robert Nekic08 мар. 2012 г., 23:31
Спасибо! Я подумал, что, возможно, FileDescriptor может дать некоторые неочевидные преимущества; Преимущества буферизации или что-то подобное.
Решение Вопроса

mediaPlayer.setDataSource(String path) потерпит неудачу, когда вы позвонитеmediaPlayer.prepare(), если вы пытаетесь загрузить файл изgetApplicationContext().getFilesDir()в зависимости от того, как файл был сохранен. Например, если я пишу файл с помощьюnew RandomAccessFile(filePath, "rw")файл не читается медиаплеером, если вы используетеmediaPlayer.setDataSource(String path),prepare() немедленно сработаетerror(1, -2147483648) от медиаплеера; по существу ошибка разрешения файла. SDK 9 представленfile.setReadable (boolean readable, boolean ownerOnly) что, вероятно, позволит вам решить эту проблему, установивownerOnly в ложь ... но это не поможет вам, если вам нужно поддерживать старые SDK.

ТЕМ НЕ МЕНИЕ,mediaPlayer.setDataSource(FileDescriptor fd) не имеет этой проблемы, и медиаплеер успешно подготовит тот же самый файл без проблем с разрешениями.

 braden23 мая 2012 г., 22:07
-2147483648 не является ошибкой разрешения файла.
 Robert Nekic24 мая 2012 г., 14:53
weston-fl.com/blog/?p=2988 Независимо от причины, указание медиаплеера на файл в папке «Files Dir» приложения с помощью String завершается неудачно, но использование дескриптора файла работает.
 Reinier23 мая 2013 г., 23:08
На связанной ноте; при воспроизведении видео из зашифрованного файла расширения APK (.OBB) необходимо использовать FileDescriptor, чтобы ваше видео воспроизводилось в MediaPlayer. MediaPlayer пытается получить доступ к файлам вне контекста вашего приложения, где у него нет необходимых прав для чтения вашего OBB-файла. С помощьюFileDescriptor преодолевает эту проблему.

Ваш ответ на вопрос