我在 TextureView 中放入了一个 MediaPlayer,它本身位于 ListView 中。
昨天,MediaPlayer 按预期使用了一个测试 .mp4 剪辑。今天,MediaPlayer 尝试做某种 FFmpeg 提取器,但我一直无法找到任何相关信息。
这是堆栈跟踪:
03-14 13:43:00.076 477-16532/? V/FFmpegExtractor: SniffFFMPEG
03-14 13:43:00.076 477-16532/? I/FFmpegExtractor: android-source:0xafcff040
03-14 13:43:00.077 477-16532/? D/FFMPEG: android source begin open
03-14 13:43:00.077 477-16532/? D/FFMPEG: android open, url: android-source:0xafcff040
03-14 13:43:00.077 477-16532/? D/FFMPEG: ffmpeg open android data source success, source ptr: 0xafcff040
03-14 13:43:00.077 477-16532/? D/FFMPEG: android source open success
03-14 13:43:00.149 477-16532/? I/FFMPEG: Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'android-source:0xafcff040':
03-14 13:43:00.149 477-16532/? I/FFMPEG: Metadata:
03-14 13:43:00.149 477-16532/? I/FFMPEG: major_brand : qt
03-14 13:43:00.149 477-16532/? I/FFMPEG: minor_version : 0
03-14 13:43:00.149 477-16532/? I/FFMPEG: compatible_brands: qt
03-14 13:43:00.149 477-16532/? I/FFMPEG: creation_time : 2016-03-13 19:24:58
03-14 13:43:00.149 477-16532/? I/FFMPEG: Duration: 00:00:10.88, start: 0.000000, bitrate: 11209 kb/s
03-14 13:43:00.149 477-16532/? I/FFMPEG: Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 86 kb/s (default)
03-14 13:43:00.149 477-16532/? I/FFMPEG: Metadata:
03-14 13:43:00.149 477-16532/? I/FFMPEG: creation_time : 2016-03-13 19:24:58
03-14 13:43:00.149 477-16532/? I/FFMPEG: handler_name : Core Media Data Handler
03-14 13:43:00.149 477-16532/? I/FFMPEG: Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 11113 kb/s, 29.98 fps, 29.97 tbr, 600 tbn, 50 tbc (default)
03-14 13:43:00.149 477-16532/? I/FFMPEG: Metadata:
03-14 13:43:00.149 477-16532/? I/FFMPEG: creation_time : 2016-03-13 19:24:58
03-14 13:43:00.149 477-16532/? I/FFMPEG: handler_name : Core Media Data Handler
03-14 13:43:00.149 477-16532/? I/FFMPEG: encoder : H.264
03-14 13:43:00.149 477-16532/? I/FFMPEG: Stream #0:2(und): Data: none (mebx / 0x7862656D), 1 kb/s (default)
03-14 13:43:00.149 477-16532/? I/FFMPEG: Metadata:
03-14 13:43:00.149 477-16532/? I/FFMPEG: creation_time : 2016-03-13 19:24:58
03-14 13:43:00.149 477-16532/? I/FFMPEG: handler_name : Core Media Data Handler
03-14 13:43:00.149 477-16532/? I/FFMPEG: Stream #0:3(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
03-14 13:43:00.149 477-16532/? I/FFMPEG: Metadata:
03-14 13:43:00.149 477-16532/? I/FFMPEG: creation_time : 2016-03-13 19:24:58
03-14 13:43:00.149 477-16532/? I/FFMPEG: handler_name : Core Media Data Handler
03-14 13:43:00.149 477-16532/? I/FFmpegExtractor: FFmpegExtrator, url: android-source:0xafcff040, format_name: mov,mp4,m4a,3gp,3g2,mj2, format_long_name: QuickTime / MOV
03-14 13:43:00.149 477-16532/? I/FFmpegExtractor: list the formats suppoted by ffmpeg:
03-14 13:43:00.149 477-16532/? I/FFmpegExtractor: ========================================
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[00]: mpeg
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[01]: mpegts
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[02]: mov,mp4,m4a,3gp,3g2,mj2
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[03]: matroska,webm
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[04]: asf
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[05]: rm
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[06]: flv
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[07]: swf
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[08]: avi
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[09]: ape
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[10]: dts
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[11]: flac
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[12]: ac3
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[13]: wav
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[14]: ogg
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[15]: vc1
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: format_names[16]: hevc
03-14 13:43:00.149 477-16532/? I/FFmpegExtractor: ========================================
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: major_brand tag is:qt
03-14 13:43:00.149 477-16532/? I/FFmpegExtractor: [mp4]format is mov, confidence should be larger than mpeg4
03-14 13:43:00.149 477-16532/? D/FFMPEG: android source close
03-14 13:43:00.149 477-16532/? I/FFmpegExtractor: sniff through BetterSniffFFMPEG success
03-14 13:43:00.149 477-16532/? D/FFmpegExtractor: ffmpeg detected media content as 'video/mp4' with confidence 0.41
03-14 13:43:00.149 477-16532/? I/MediaExtractor: Use extended extractor for the special mime(video/mp4) or codec
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: FFmpegExtractor::FFmpegExtractor
03-14 13:43:00.149 477-16532/? V/FFmpegExtractor: mFilename: android-source:0xafcff040
03-14 13:43:00.150 477-16532/? D/FFMPEG: android source begin open
03-14 13:43:00.150 477-16532/? D/FFMPEG: android open, url: android-source:0xafcff040
03-14 13:43:00.150 477-16532/? D/FFMPEG: ffmpeg open android data source success, source ptr: 0xafcff040
03-14 13:43:00.150 477-16532/? D/FFMPEG: android source open success
03-14 13:43:00.230 477-16532/? V/FFmpegExtractor: file startTime: 0
03-14 13:43:00.230 477-16532/? I/FFmpegExtractor: the duration is 00:00:10.87
03-14 13:43:00.230 477-16532/? I/FFmpegExtractor: stream_index: 0
03-14 13:43:00.230 477-16532/? I/FFmpegExtractor: support the codec(aac)
03-14 13:43:00.230 477-16532/? V/FFmpegExtractor: Tag mp4a/0x6134706d with codec(aac)
03-14 13:43:00.230 477-16532/? V/FFmpegExtractor: audio stream extradata(2):
03-14 13:43:00.230 477-16532/? V/codec_utils: AAC
03-14 13:43:00.230 477-16532/? V/codec_utils: aac profile: 1, sf_index: 4, channel: 1
03-14 13:43:00.230 477-16532/? I/FFmpegExtractor: bit_rate: 86249, sample_rate: 44100, channels: 1, bits_per_coded_sample: 16, block_align:0
03-14 13:43:00.230 477-16532/? I/FFmpegExtractor: the time is 00:00:10.93
03-14 13:43:00.230 477-16532/? V/FFmpegExtractor: audio startTime:0
03-14 13:43:00.230 477-16532/? V/FFmpegExtractor: create a audio track
03-14 13:43:00.230 477-16532/? I/FFmpegExtractor: stream_index: 1
03-14 13:43:00.230 477-16532/? I/FFmpegExtractor: support the codec(h264)
03-14 13:43:00.230 477-16532/? V/FFmpegExtractor: Tag avc1/0x31637661 with codec(h264)
03-14 13:43:00.230 477-16532/? V/FFmpegExtractor: video stream extradata:
03-14 13:43:00.230 477-16532/? V/codec_utils: AVC
03-14 13:43:00.230 477-16532/? I/FFmpegExtractor: width: 1920, height: 1080, bit_rate: 11113682
03-14 13:43:00.230 477-16532/? I/FFmpegExtractor: the time is 00:00:10.87
03-14 13:43:00.230 477-16532/? V/FFmpegExtractor: video startTime:0
03-14 13:43:00.230 477-16532/? V/FFmpegExtractor: create a video track
03-14 13:43:00.230 477-16532/? V/FFmpegExtractor: the stream is AVC, the length of a NAL unit: 4
03-14 13:43:00.230 477-16532/? V/FFmpegExtractor: Starting reader thread
03-14 13:43:00.230 477-16532/? D/FFmpegExtractor: Reader thread started
03-14 13:43:00.231 477-16532/? V/FFmpegExtractor: mProbePkts: 0, mEOF: 0, pb->error(if has): 0, mDefersToCreateVideoTrack: 0, mDefersToCreateAudioTrack: 0
03-14 13:43:00.231 477-16532/? D/FFmpegExtractor: supported mime: video/mp4
03-14 13:43:00.231 477-16532/? V/FFmpegExtractor: FFmpegExtractor::getMetaData
03-14 13:43:00.231 477-16537/? V/FFmpegExtractor: FFmpegExtractor enter thread(readerEntry)
03-14 13:43:00.231 477-16532/? V/FFmpegExtractor: FFmpegExtractor::getTrack[0]
03-14 13:43:00.231 477-16532/? V/FFmpegExtractor: FFmpegExtractor::getTrackMetaData[0]
03-14 13:43:00.231 477-16532/? V/FFmpegExtractor: FFmpegExtractor::getTrack[1]
03-14 13:43:00.231 477-16532/? V/FFmpegExtractor: FFmpegExtractor::getTrackMetaData[1]
03-14 13:43:00.232 10973-10973/com.hobbyte.touringandroid E/MediaPlayer: Should have subtitle controller already set
在尝试播放视频文件时,我得到了这个日志:
03-14 13:52:06.133 743-821/system_process W/AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client
03-14 13:52:06.133 477-477/? D/NuPlayerDriver: start(0xb0f05040)
03-14 13:52:06.133 477-16531/? I/GenericSource: start
03-14 13:52:06.133 477-16531/? V/FFmpegExtractor: FFmpegExtractor::Track::start audio
03-14 13:52:06.133 477-16531/? V/FFmpegExtractor: FFmpegExtractor::Track::start video
03-14 13:52:06.133 477-16532/? V/FFmpegExtractor: read audio flush pkt
03-14 13:52:06.133 477-16532/? V/FFmpegExtractor: read video flush pkt
03-14 13:52:06.139 477-24743/? D/SoftFFmpegAudio: SoftFFmpegAudio component: OMX.ffmpeg.aac.decoder mMode: 1
03-14 13:52:06.141 477-24743/? V/SoftFFmpegAudio: get pcm params, nChannels:4294967295, nSamplingRate:4294967295
03-14 13:52:06.141 477-24743/? V/SoftFFmpegAudio: set OMX_IndexParamAudioPcm, nChannels:1, nSampleRate:44100, nBitsPerSample:16
03-14 13:52:06.141 477-24743/? V/SoftFFmpegAudio: set OMX_IndexParamAudioAac, nChannels:1, nSampleRate:44100
03-14 13:52:06.141 477-24743/? E/OMXNodeInstance: setParameter(1866465283) ERROR: 0x8000101a
03-14 13:52:06.141 477-24743/? V/SoftFFmpegAudio: get pcm params, nChannels:1, nSamplingRate:44100
03-14 13:52:06.147 477-24744/? E/OMXNodeInstance: OMX_GetExtensionIndex OMX.google.android.index.storeMetaDataInBuffers failed
03-14 13:52:06.147 477-24744/? E/ACodec: [OMX.google.h264.decoder] storeMetaDataInBuffers failed w/ err -2147483648
03-14 13:52:06.149 477-24745/? I/SoftFFmpegAudio: got extradata, ignore: 0, size: 2
03-14 13:52:06.150 477-24745/? I/SoftFFmpegAudio: extradata is ready, size: 2
03-14 13:52:06.150 477-24745/? D/SoftFFmpegAudio: begin to open ffmpeg audio decoder(aac), mCtx sample_rate: 44100, channels: 1, , sample_fmt: (null)
03-14 13:52:06.154 477-24745/? D/SoftFFmpegAudio: open ffmpeg audio decoder(aac) success, mCtx sample_rate: 44100, channels: 1, sample_fmt: fltp
03-14 13:52:06.154 477-24745/? I/SoftFFmpegAudio: Create sample rate converter for conversion of 44100 Hz fltp 1 channels(mono) to 44100 Hz s16 1 channels(mono)!
03-14 13:52:06.154 477-24743/? V/SoftFFmpegAudio: get pcm params, nChannels:1, nSamplingRate:44100
03-14 13:52:06.155 477-24739/? D/AudioSink: bufferCount (8) is too small and increased to 12
03-14 13:52:06.162 477-24747/? E/SoftAVC: Decoder failed: -2
03-14 13:52:06.162 477-24744/? E/ACodec: [OMX.google.h264.decoder] ERROR(0x80001001)
03-14 13:52:06.162 477-24744/? E/ACodec: signalError(omxError 0x80001001, internalError -2147483648)
03-14 13:52:06.163 477-24741/? E/MediaCodec: Codec reported err 0x80001001, actionCode 0, while in state 6
03-14 13:52:06.167 477-24740/? E/NuPlayerDecoder: Failed to queue input buffer for OMX.google.h264.decoder (err=-38)
03-14 13:52:06.167 477-16531/? E/NuPlayer: received error(0xffffffda) from video decoder, flushing(0), now shutting down
03-14 13:52:06.168 10973-11040/com.hobbyte.touringandroid E/MediaPlayer: error (1, -38)
03-14 13:52:06.168 10973-10973/com.hobbyte.touringandroid E/MediaPlayer: Error (1,-38)
03-14 13:52:06.168 477-24740/? E/NuPlayerDecoder: failed to flush OMX.google.h264.decoder (err=-38)
03-14 13:52:06.168 477-16531/? E/NuPlayer: received error(0xffffffda) from video decoder, flushing(2), now shutting down
03-14 13:52:06.169 10973-10989/com.hobbyte.touringandroid E/MediaPlayer: error (1, -38)
03-14 13:52:06.170 10973-10973/com.hobbyte.touringandroid E/MediaPlayer: Error (1,-38)
作为参考,这是我的类文件:
package com.hobbyte.touringandroid.ui.adapter;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import com.google.android.exoplayer.ExoPlayer;
import com.google.android.exoplayer.FrameworkSampleSource;
import com.google.android.exoplayer.MediaCodecVideoTrackRenderer;
import com.google.android.exoplayer.SampleSource;
import com.google.android.exoplayer.TrackRenderer;
import com.hobbyte.touringandroid.App;
import com.hobbyte.touringandroid.tourdata.ListViewItem;
import com.hobbyte.touringandroid.internet.LoadImageFromURL;
import com.hobbyte.touringandroid.R;
import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Nikita
*/
public class PoiContentAdapter extends ArrayAdapter<ListViewItem> {
private static final String TAG = "PoiContentAdapter";
public static final int HEADER = 0;
public static final int BODY = 1;
public static final int IMAGE = 2;
public static final int VIDEO = 3;
private static Pattern namePattern;
private static final String FILE_NAME_PATTERN = "https?:\\/\\/[-\\w\\.\\/]*\\/(.+\\.(jpe?g|png|mp4))";
private ListViewItem[] items;
private String keyID;
private TextureView textureView;
private MediaPlayer player;
private AudioManager audio;
private ImageButton play;
private ImageButton replay;
private ImageButton mute;
private ImageButton max;
private SeekBar volume;
private String filePath;
@Override
public int getViewTypeCount() {
return 4;
}
@Override
public int getItemViewType(int position) {
return items[position].getType();
}
public PoiContentAdapter(Context context, ListViewItem[] content, String keyID) {
super(context, 0, content);
this.keyID = keyID;
items = content;
namePattern = Pattern.compile(FILE_NAME_PATTERN);
}
/**
* Inflates a certain view depending on the type of ListViewItem (Normal text or Image URL)
* @param position Position of item in the ItemList
* @param view View
* @param parent ParentView
* @return the view in question
*/
@Override
public View getView(int position, View view, ViewGroup parent) {
ListViewItem listViewItem = items[position];
int listViewItemType = getItemViewType(position);
String filename = null;
TextView contentView;
if (listViewItem.getUrl() != null) {
Matcher m = namePattern.matcher(listViewItem.getUrl());
if (m.matches()) {
filename = m.group(1);
}
}
if (view == null) {
if (listViewItemType == IMAGE) {
view = LayoutInflater.from(getContext()).inflate(R.layout.poi_image, parent, false);
} else if(listViewItemType == VIDEO) {
view = LayoutInflater.from(getContext()).inflate(R.layout.poi_video, parent, false);
} else {
view = LayoutInflater.from(getContext()).inflate(R.layout.poi_content, parent, false);
}
}
switch (listViewItemType) {
case IMAGE:
ImageView imageView = (ImageView) view.findViewById(R.id.poiContentImageView);
TextView textView = (TextView) view.findViewById(R.id.poiContentImageDesc);
textView.setText(listViewItem.getText());
if (filename != null) {
new LoadImageFromURL(imageView, App.context).execute(filename, keyID); //Load image in a separate thread
}
return view;
case VIDEO:
filePath = getContext().getFilesDir() + "/" + String.format("%s/video/%s", keyID, filename);
File file = new File(filePath);
if(!file.exists()) {
view = LayoutInflater.from(getContext()).inflate(R.layout.poi_content, parent, false);
contentView = (TextView) view.findViewById(R.id.poiContentTextView);
contentView.setText("This contains a video." + "\n" + "Download this tour with Media to see this Video!" + "\n");
contentView.setGravity(Gravity.CENTER_HORIZONTAL);
} else {
System.out.println(filePath);
textureView = (TextureView) view.findViewById(R.id.poiContentVideoView);
DisplayMetrics metrics = App.context.getResources().getDisplayMetrics();
int height = metrics.heightPixels / 2;
int width = metrics.widthPixels;
textureView.setMinimumHeight(height);
textureView.setMinimumWidth(width);
play = (ImageButton) view.findViewById(R.id.playButton);
replay = (ImageButton) view.findViewById(R.id.replayButtoon);
mute = (ImageButton) view.findViewById(R.id.muteButton);
max = (ImageButton) view.findViewById(R.id.maxVolButton);
volume = (SeekBar) view.findViewById(R.id.volumeControl);
audio = (AudioManager) App.context.getSystemService(Context.AUDIO_SERVICE);
textureView.setSurfaceTextureListener(videoListener);
TextView videoDesc = (TextView) view.findViewById(R.id.poiContentVideoDesc);
videoDesc.setText(listViewItem.getText());
}
return view;
case HEADER:
// TODO
if(view.findViewById(R.id.poiContentTextView) == null) {
view = LayoutInflater.from(getContext()).inflate(R.layout.poi_content, parent, false);
}
contentView = (TextView) view.findViewById(R.id.poiContentTextView);
contentView.setText(listViewItem.getText() + "\n");
if(listViewItem.getText().length() == 0) {
return new View(getContext());
}
return view;
case BODY:
// TODO
contentView = (TextView) view.findViewById(R.id.poiContentTextView);
contentView.setText(listViewItem.getText() + "\n");
return view;
default:
contentView = (TextView) view.findViewById(R.id.poiContentTextView);
contentView.setText("Something went wrong\n");
return view;
}
}
private TextureView.SurfaceTextureListener videoListener = new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Surface s = new Surface(surface);
try {
player = new MediaPlayer();
player.setDataSource(filePath);
player.setSurface(s);
player.prepareAsync();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT);
player.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
//Do nothing
}
});
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//Do nothing
}
});
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(final MediaPlayer mp) {
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mp.isPlaying()) {
mp.pause();
play.setImageResource(R.mipmap.ic_play_arrow_white_36dp);
} else {
mp.start();
play.setImageResource(R.mipmap.ic_pause_white_36dp);
}
}
});
replay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mp.isPlaying()) {
play.setImageResource(R.mipmap.ic_play_arrow_white_36dp);
mp.pause();
mp.seekTo(0);
} else {
play.setImageResource(R.mipmap.ic_play_arrow_white_36dp);
mp.seekTo(0);
}
}
});
mute.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mp.setVolume(0.0f, 0.0f);
volume.setProgress(0);
}
});
max.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mp.setVolume(1.0f, 1.0f);
volume.setProgress(audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
}
});
int maxVolume = audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int currVolume = audio.getStreamVolume(AudioManager.STREAM_MUSIC);
volume.setMax(maxVolume);
volume.setProgress(currVolume);
volume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
audio.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
});
player.setOnVideoSizeChangedListener(new MediaPlayer.OnVideoSizeChangedListener() {
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
//Do nothing
}
});
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
if (player != null) {
player.stop();
player.release();
player = null;
}
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
};
}
我真的一点也不明白是什么导致了所有这些错误,为什么视频文件无法播放?如果有人能够提供帮助,我将不胜感激!
我正在使用 Genymotion 模拟器 - Google Nexus 4 - API 21
非常感谢!