Last active
October 20, 2017 13:24
-
-
Save bulentsiyah/cd00231dd05976e0c7fd09fd31d9438b to your computer and use it in GitHub Desktop.
SD kartaki resmi yayınlama uygulaması (Android) -- http://www.bulentsiyah.com/sd-kartaki-resmi-stream-etme-uygulamasi-android/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.javacv.stream.test2; | |
import android.app.Activity; | |
import android.content.Context; | |
import android.content.pm.ActivityInfo; | |
import android.graphics.Bitmap; | |
import android.graphics.BitmapFactory; | |
import android.graphics.BitmapFactory.Options; | |
import android.graphics.Canvas; | |
import android.graphics.Color; | |
import android.graphics.ImageFormat; | |
import android.graphics.Paint; | |
import android.graphics.RectF; | |
import android.hardware.Camera; | |
import android.hardware.Camera.PreviewCallback; | |
import android.media.AudioFormat; | |
import android.media.AudioRecord; | |
import android.media.MediaRecorder; | |
import android.os.Bundle; | |
import android.os.Environment; | |
import android.os.PowerManager; | |
import android.util.Log; | |
import android.view.KeyEvent; | |
import android.view.SurfaceHolder; | |
import android.view.SurfaceView; | |
import android.view.View; | |
import android.view.View.OnClickListener; | |
import android.widget.Button; | |
import android.widget.LinearLayout; | |
import android.widget.TextView; | |
import java.io.ByteArrayOutputStream; | |
import java.io.File; | |
import java.io.FileInputStream; | |
import java.io.FileNotFoundException; | |
import java.io.IOException; | |
import java.nio.BufferUnderflowException; | |
import java.nio.ByteBuffer; | |
import java.nio.ShortBuffer; | |
import java.util.Timer; | |
import java.util.TimerTask; | |
import com.googlecode.javacv.FFmpegFrameRecorder; | |
import com.googlecode.javacv.cpp.opencv_core.IplImage; | |
import static com.googlecode.javacv.cpp.opencv_core.*; | |
public class MainActivity extends Activity implements OnClickListener { | |
private final static String LOG_TAG = "MainActivity"; | |
private PowerManager.WakeLock mWakeLock; | |
private String ffmpeg_link = "rtmp://192.168.1.148/live/test2"; | |
//private String ffmpeg_link = "/mnt/sdcard/new_stream.flv"; | |
private volatile FFmpegFrameRecorder recorder; | |
boolean recording = false; | |
long startTime = 0; | |
private int imageWidth = 640; | |
private int imageHeight = 480; | |
private int frameRate = 20; | |
private int sampleAudioRateInHz = 44100; | |
private Thread audioThread; | |
volatile boolean runAudioThread = true; | |
private AudioRecord audioRecord; | |
private AudioRecordRunnable audioRecordRunnable; | |
//private CameraView cameraView; | |
private IplImage yuvIplimage = null; | |
private Button recordButton; | |
private LinearLayout mainLayout; | |
Timer timerCameraLive; | |
TextView textView; | |
String filepath= Environment.getExternalStorageDirectory()+"/INPUT.jpg"; | |
int size = imageWidth* imageHeight; | |
ByteBuffer buffer =null; | |
Bitmap bmp ; | |
byte[] bytes = new byte[size]; | |
long videoTimestamp = 0; | |
Options opt = new Options(); | |
@Override | |
public void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); | |
setContentView(R.layout.activity_main); | |
textView=(TextView) findViewById(R.id.textView1); | |
opt.inDither = false; //important | |
opt.inPreferredConfig = Bitmap.Config.ARGB_8888; | |
try { | |
bmp = BitmapFactory.decodeFile(filepath, opt); | |
if (buffer == null) | |
buffer = ByteBuffer | |
.allocate(bmp.getRowBytes() * bmp.getHeight()); | |
buffer.position(0); | |
bmp.copyPixelsToBuffer(buffer); | |
bytes = buffer.array(); | |
} catch (Exception exp) { | |
exp.toString(); | |
} | |
mainLayout = (LinearLayout) this.findViewById(R.id.record_layout); | |
recordButton = (Button) findViewById(R.id.recorder_control); | |
recordButton.setText("Basla"); | |
recordButton.setOnClickListener(this); | |
// cameraView = new CameraView(this); | |
//LinearLayout.LayoutParams layoutParam = new LinearLayout.LayoutParams(imageWidth, imageHeight); | |
// mainLayout.addView(cameraView, layoutParam); | |
if (yuvIplimage == null) { | |
yuvIplimage = IplImage.create(imageWidth, imageHeight, IPL_DEPTH_8U, 4); | |
} | |
recorder = new FFmpegFrameRecorder(ffmpeg_link, imageWidth, imageHeight, 1); | |
recorder.setFormat("flv"); | |
recorder.setSampleRate(sampleAudioRateInHz); | |
recorder.setFrameRate(frameRate); | |
audioRecordRunnable = new AudioRecordRunnable(); | |
audioThread = new Thread(audioRecordRunnable); | |
try { | |
timerCameraLive = new Timer(); | |
timerCameraLive.schedule(new TaskCameraLive(), 2000, 1 * 50); | |
} catch (Exception e) { | |
e.toString(); | |
} | |
} | |
class TaskCameraLive extends TimerTask { | |
public void run() { | |
try { | |
runOnUiThread(new Runnable() { | |
public void run() { | |
textView.setText("recording:"+recording); | |
} | |
}); | |
if (yuvIplimage != null && recording) { | |
videoTimestamp = 1000 * (System.currentTimeMillis() - startTime); | |
try { | |
yuvIplimage.getByteBuffer().put(bytes); | |
recorder.setTimestamp(videoTimestamp); | |
recorder.record(yuvIplimage); | |
} catch (FFmpegFrameRecorder.Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
} catch (Exception e) { | |
e.toString(); | |
} | |
} | |
} | |
@Override | |
protected void onResume() { | |
super.onResume(); | |
if (mWakeLock == null) { | |
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); | |
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, LOG_TAG); | |
mWakeLock.acquire(); | |
} | |
} | |
@Override | |
protected void onPause() { | |
super.onPause(); | |
if (mWakeLock != null) { | |
mWakeLock.release(); | |
mWakeLock = null; | |
} | |
} | |
@Override | |
protected void onDestroy() { | |
super.onDestroy(); | |
recording = false; | |
try { | |
timerCameraLive.cancel(); | |
timerCameraLive=null; | |
} catch (Exception e) { | |
e.toString(); | |
} | |
} | |
// Start the capture | |
public void startRecording() { | |
try { | |
recorder.start(); | |
startTime = System.currentTimeMillis(); | |
recording = true; | |
audioThread.start(); | |
} catch (FFmpegFrameRecorder.Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
public void stopRecording() { | |
// This should stop the audio thread from running | |
runAudioThread = false; | |
if (recorder != null && recording) { | |
recording = false; | |
Log.v(LOG_TAG,"Finishing recording, calling stop and release on recorder"); | |
try { | |
recorder.stop(); | |
recorder.release(); | |
} catch (FFmpegFrameRecorder.Exception e) { | |
e.printStackTrace(); | |
} | |
recorder = null; | |
} | |
} | |
@Override | |
public boolean onKeyDown(int keyCode, KeyEvent event) { | |
try{ | |
if (keyCode == KeyEvent.KEYCODE_BACK) { | |
if (recording) { | |
stopRecording(); | |
} | |
finish(); | |
return true; | |
} | |
} catch (Exception e) { | |
} | |
return super.onKeyDown(keyCode, event); | |
} | |
@Override | |
public void onClick(View v) { | |
if (!recording) { | |
startRecording(); | |
Log.w(LOG_TAG, "Start Button Pushed"); | |
recordButton.setText("Bitir"); | |
} else { | |
stopRecording(); | |
Log.w(LOG_TAG, "Stop Button Pushed"); | |
recordButton.setText("Basla"); | |
} | |
} | |
//--------------------------------------------- | |
// audio thread, gets and encodes audio data | |
//--------------------------------------------- | |
class AudioRecordRunnable implements Runnable { | |
@Override | |
public void run() { | |
// Set the thread priority | |
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); | |
// Audio | |
int bufferSize; | |
short[] audioData; | |
int bufferReadResult; | |
bufferSize = AudioRecord.getMinBufferSize(sampleAudioRateInHz, | |
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); | |
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleAudioRateInHz, | |
AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); | |
audioData = new short[bufferSize]; | |
Log.d(LOG_TAG, "audioRecord.startRecording()"); | |
audioRecord.startRecording(); | |
// Audio Capture/Encoding Loop | |
while (runAudioThread) { | |
// Read from audioRecord | |
bufferReadResult = audioRecord.read(audioData, 0, audioData.length); | |
if (bufferReadResult > 0) { | |
//Log.v(LOG_TAG,"audioRecord bufferReadResult: " + bufferReadResult); | |
// Changes in this variable may not be picked up despite it being "volatile" | |
if (recording) { | |
try { | |
// Write to FFmpegFrameRecorder | |
recorder.record(ShortBuffer.wrap(audioData, 0, bufferReadResult)); | |
} catch (FFmpegFrameRecorder.Exception e) { | |
Log.v(LOG_TAG,e.getMessage()); | |
e.printStackTrace(); | |
} | |
} | |
} | |
} | |
Log.v(LOG_TAG,"AudioThread Finished"); | |
/* Capture/Encoding finished, release recorder */ | |
if (audioRecord != null) { | |
audioRecord.stop(); | |
audioRecord.release(); | |
audioRecord = null; | |
Log.v(LOG_TAG,"audioRecord released"); | |
} | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment