You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
4.9 KiB
158 lines
4.9 KiB
package com.frank.ffmpeg.activity;
|
|
|
|
import android.Manifest;
|
|
import android.media.MediaPlayer;
|
|
import android.os.Build;
|
|
import android.os.Environment;
|
|
import android.os.Bundle;
|
|
import android.util.Log;
|
|
import android.view.SurfaceHolder;
|
|
import android.view.SurfaceView;
|
|
import android.widget.SeekBar;
|
|
|
|
import com.frank.ffmpeg.R;
|
|
import com.frank.ffmpeg.hardware.HardwareDecode;
|
|
|
|
import java.io.IOException;
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
|
|
/**
|
|
* 视频拖动实时预览
|
|
* Created by frank on 2019/11/16.
|
|
*/
|
|
|
|
public class VideoPreviewActivity extends AppCompatActivity implements HardwareDecode.OnDataCallback {
|
|
|
|
private final static String TAG = VideoPreviewActivity.class.getSimpleName();
|
|
|
|
private final static String ROOT_PATH = Environment.getExternalStorageDirectory().getAbsolutePath();
|
|
private static String PATH1 = ROOT_PATH + "/What.mp4";
|
|
// private final static String PATH2 = ROOT_PATH + "/bird-1080P.mkv";
|
|
// PATH1 = "https://www.apple.com/105/media/cn/mac/family/2018/46c4b917_abfd_45a3_9b51_4e3054191797" +
|
|
// "/films/bruce/mac-bruce-tpl-cn-2018_1280x720h.mp4";
|
|
|
|
private SeekBar previewBar;
|
|
private HardwareDecode hardwareDecode;
|
|
private long duration;
|
|
|
|
private MediaPlayer mediaPlayer;
|
|
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
setContentView(R.layout.activity_preview);
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1234);
|
|
}
|
|
|
|
initView();
|
|
setListener();
|
|
}
|
|
|
|
private void initView() {
|
|
previewBar = findViewById(R.id.preview_bar);
|
|
|
|
SurfaceView surfaceVideo = findViewById(R.id.surface_view);
|
|
setCallback(surfaceVideo);
|
|
|
|
SurfaceView surfaceView = findViewById(R.id.surface_preview);
|
|
setCallbackAndPlay(PATH1, surfaceView);
|
|
|
|
// SurfaceView surfaceViewOther = findViewById(R.id.surface_view_other);
|
|
// setCallbackAndPlay(PATH2, surfaceViewOther);
|
|
}
|
|
|
|
private void setCallback(SurfaceView surfaceView) {
|
|
mediaPlayer = new MediaPlayer();
|
|
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
|
|
@Override
|
|
public void onPrepared(MediaPlayer mp) {
|
|
Log.e(TAG, "onPrepared...");
|
|
mediaPlayer.start();
|
|
}
|
|
});
|
|
|
|
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
|
|
@Override
|
|
public void surfaceCreated(SurfaceHolder holder) {
|
|
try {
|
|
mediaPlayer.setDataSource(PATH1);
|
|
mediaPlayer.setSurface(holder.getSurface());
|
|
mediaPlayer.prepareAsync();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void surfaceDestroyed(SurfaceHolder holder) {
|
|
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
private void setCallbackAndPlay(final String filePath, SurfaceView surfaceView) {
|
|
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
|
|
@Override
|
|
public void surfaceCreated(SurfaceHolder holder) {
|
|
|
|
hardwareDecode = new HardwareDecode(holder.getSurface(), filePath, VideoPreviewActivity.this);
|
|
hardwareDecode.decode();
|
|
}
|
|
|
|
@Override
|
|
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void surfaceDestroyed(SurfaceHolder holder) {
|
|
|
|
}
|
|
});
|
|
}
|
|
|
|
private void setListener() {
|
|
previewBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
|
|
@Override
|
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
|
if (!fromUser) {
|
|
return;
|
|
}
|
|
previewBar.setProgress(progress);
|
|
if (hardwareDecode != null && progress < duration) {
|
|
hardwareDecode.seekTo(progress);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onStartTrackingTouch(SeekBar seekBar) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
|
//TODO
|
|
if (mediaPlayer != null) {
|
|
Log.e(TAG, "onStop progress=" + seekBar.getProgress());
|
|
mediaPlayer.seekTo(seekBar.getProgress()/1000);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
public void onData(long duration) {
|
|
Log.e(TAG,"duration=" + duration);
|
|
this.duration = duration;
|
|
previewBar.setMax((int) duration);
|
|
}
|
|
|
|
}
|
|
|