Я испытываю большие затруднения, заставляя мое приложение Android играть видео от SD-карты. Не имеет значения, о каком размере, скорости передачи, формате видео или любой другой установке я могу думать, ни эмулятор, ни мой G1 не будут играть ничего, что я пытаюсь закодировать. Я также попробовал много видео от сети (различные форматы видео, скорости передачи, с и без аудиотреков, и т.д.), и ни один из тех не работает также.
Все, что я продолжаю получать, является диалоговым окном, которое говорит:
"Не может играть видео"
"Извините, это видео не может играться".
Существуют ошибки, о которых сообщают в LogCat, но я не понимаю их, и я попытался искать Интернет дальнейшие объяснения без любой удачи. Посмотрите ниже:
03-30 05:34:26.807: ERROR/QCOmxcore(51): OMXCORE API : Free Handle 390d4
03-30 05:34:26.817: ERROR/QCOmxcore(51): Unloading the dynamic library for OMX.qcom.video.decoder.avc
03-30 05:34:26.817: ERROR/PlayerDriver(51): Command PLAYER_PREPARE completed with an error or info PVMFErrNoResources
03-30 05:34:26.857: ERROR/MediaPlayer(14744): error (1, -15)03-30 05:34:26.867: ERROR/MediaPlayer(14744): Error (1,-15)
Иногда я также получаю это:
03-30 05:49:49.267: ERROR/PlayerDriver(51): Command PLAYER_INIT completed with an error or info PVMFErrResource
03-30 05:49:49.267: ERROR/MediaPlayer(19049): error (1, -17)
03-30 05:49:49.347: ERROR/MediaPlayer(19049): Error (1,-17)
Вот код, я использую (в моем onCreate () метод):
this.setContentView(R.layout.main);
//just a simple VideoView loading files from the SD card
VideoView myIntroView = (VideoView) this.findViewById(R.id.VideoView01);
MediaController mc = new MediaController(this);
myIntroView.setMediaController(mc);
myIntroView.setVideoPath("/sdcard/test.mp4");
myIntroView.requestFocus();
myIntroView.start();
Помогите!
Хорошо, приступаем. Видео, над которым я работал в Adobe Premiere, должно быть 480x800 (ШxВ), но у меня Adobe Media Encoder выводит последовательность как «Несжатый Microsoft AVI» с использованием видеокодека «UYVY», частота кадров 24 кадра в секунду, прогрессивная , квадратные пиксели и размеры: 720x800 (ШxВ). Это выводит довольно большой файл с черными границами 120 пикселей по обе стороны от видеоконтента. Затем я беру видео в Handbrake 0.9.4 и использую следующие настройки (я начал с предустановки Regular-> Normal):
Container: MP4 File
Large file size: [un-Checked]
Web-optimized: [un-Checked]
iPod 5G support: [un-Checked]
Width: 320 (this is key, any higher than 320 and it won’t work)
Height: 528
Keep Aspect Ratio: [Checked]
Anamorphic: None
Crop Left: 120
Crop Right: 120
Everything under the "Video Filter" tab set to "Off"
Video Codec: H.264(x264)
Framerate: same as source
2-Pass Encoding: [Checked]
Turbo first pass: [un-Checked]
Avg Bitrate: 384
Create chapter markers: [un-Checked]
Reference Frames: 2
Mixed References: [un-Checked]
B-Frames: 0
Motion Estimation Method: Uneven Multi-Hexagon
Sub-pixel Motion Estimation: 9
Motion Estimation Range: 16
Analysis: Default
8x8 DCT: [un-Checked]
CABAC Entropy Coding: [un-Checked]
No Fast-P-Skip: [un-Checked]
No DCT-Decimate: [un-Checked]
Deblocking: Default, Default
Psychovisual Rate Distortion: [MAX]
Моя основная проблема заключалась в том, что я пытался вывести файл mp4 с размерами 480x800 (ШxВ). После изменения ширины на 320 (более высокие значения не работали) при сохранении правильного соотношения сторон выходное видео теперь воспроизводится без ошибок. Надеюсь, это поможет кому-то еще с аналогичной проблемой.
Боковое примечание: хотелось бы, чтобы ограничения видео для Android были лучше задокументированы.
У меня были небольшие проблемы с воспроизведением множества разных видео на моем телефоне (HTC hero). Стандартный формат 512K mp4 (пример: http://www.archive.org/details/more_animation ), сначала проконсультируйтесь с ними, чтобы убедиться, что это не ваш код.
Вот мой код из onCreate () во вложенном действии, которое воспроизводит только видеофайл:
protected VideoView mine;
protected boolean done = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.videoshow);
mine = (VideoView) findViewById(R.id.video); // Save the VideoView for touch event processing
try {
String myURI = "/sdcard/" + path + "/v/"
+ currentItem.getFile()
+ "." + currentItem.getFileType();
Uri video = Uri.parse(myURI);
mine.setVideoURI(video);
mine.start();
mine.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
result.putExtra("com.ejf.convincer01.Finished", true);
done = true;
}
});
} catch (Exception ex) {
Log.d(DEBUG_TAG, "Video failed: '" + ex + "'" );
}