
Recherche avancée
Médias (3)
-
Elephants Dream - Cover of the soundtrack
17 octobre 2011, par
Mis à jour : Octobre 2011
Langue : English
Type : Image
-
Valkaama DVD Label
4 octobre 2011, par
Mis à jour : Février 2013
Langue : English
Type : Image
-
Publier une image simplement
13 avril 2011, par ,
Mis à jour : Février 2012
Langue : français
Type : Video
Autres articles (98)
-
MediaSPIP 0.1 Beta version
25 avril 2011, parMediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
The zip file provided here only contains the sources of MediaSPIP in its standalone version.
To get a working installation, you must manually install all-software dependencies on the server.
If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...) -
HTML5 audio and video support
13 avril 2011, parMediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
For older browsers the Flowplayer flash fallback is used.
MediaSPIP allows for media playback on major mobile platforms with the above (...) -
ANNEXE : Les plugins utilisés spécifiquement pour la ferme
5 mars 2010, parLe site central/maître de la ferme a besoin d’utiliser plusieurs plugins supplémentaires vis à vis des canaux pour son bon fonctionnement. le plugin Gestion de la mutualisation ; le plugin inscription3 pour gérer les inscriptions et les demandes de création d’instance de mutualisation dès l’inscription des utilisateurs ; le plugin verifier qui fournit une API de vérification des champs (utilisé par inscription3) ; le plugin champs extras v2 nécessité par inscription3 (...)
Sur d’autres sites (6270)
-
parser not found for codec wmav2
5 décembre 2011, par HashCoderI am getting a warning when I run the below command.
Warning : [asf @ 01C787A0] parser not found for codec wmav2, packets or times may be inval
id.I am using the latest ffmpeg.exe, did I miss any parameters. Any suggestions please.
ffmpeg -i Assets\Logitech_webcam_on_PC.wmv -sameq -f swf -y -an -s 640x360 MySlide.swf
ffmpeg version N-35295-gb55dd10, Copyright (c) 2000-2011 the FFmpeg developers
built on Nov 30 2011 00:52:52 with gcc 4.6.2
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-ru
ntime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libope
ncore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --en
able-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger -
-enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwben
c --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-
libxvid --enable-zlib
libavutil 51. 29. 1 / 51. 29. 1
libavcodec 53. 39. 1 / 53. 39. 1
libavformat 53. 22. 0 / 53. 22. 0
libavdevice 53. 4. 0 / 53. 4. 0
libavfilter 2. 50. 0 / 2. 50. 0
libswscale 2. 1. 0 / 2. 1. 0
libpostproc 51. 2. 0 / 51. 2. 0
[asf @ 01C787A0] parser not found for codec wmav2, packets or times may be inval
id.
Seems stream 1 codec frame rate differs from container frame rate: 1000.00 (1000
/1) -> 0.08 (1/12)
Input #0, asf, from 'Assets\Logitech_webcam_on_PC.wmv':
Metadata:
WMFSDKVersion : 11.0.5721.5265
WMFSDKNeeded : 0.0.0.0000
IsVBR : 1
VBR Peak : 50500.0000
Buffer Average : 66550.0000
Duration: 00:00:36.22, start: 0.000000, bitrate: 497 kb/s
Stream #0:0(eng): Audio: wmav2 (a[1][0][0] / 0x0161), 32000 Hz, 1 channels,
s16, 20 kb/s
Stream #0:1(eng): Video: wmv2 (WMV2 / 0x32564D57), yuv420p, 320x180, 422 kb/
s, 0.08 tbr, 1k tbn, 1k tbc
[buffer @ 02AA9760] w:320 h:180 pixfmt:yuv420p tb:1/1000000 sar:0/1 sws_param:
[scale @ 02AA9A80] w:320 h:180 fmt:yuv420p -> w:640 h:360 fmt:yuv420p flags:0x4
Output #0, swf, to 'MySlide.swf':
Metadata:
WMFSDKVersion : 11.0.5721.5265
WMFSDKNeeded : 0.0.0.0000
IsVBR : 1
VBR Peak : 50500.0000
Buffer Average : 66550.0000
encoder : Lavf53.22.0
Stream #0:0(eng): Video: flv1, yuv420p, 640x360, q=2-31, 200 kb/s, 90k tbn,
0.08 tbc
Stream mapping:
Stream #0:1 -> #0:0 (wmv2 -> flv)
Press [q] to stop, [?] for help
frame= 4 fps= 0 q=0.0 size= 97kB time=00:00:48.00 bitrate= 16.6kbits/s
frame= 5 fps= 0 q=0.0 Lsize= 111kB time=00:01:00.00 bitrate= 15.2kbits/
s dup=0 drop=599
video:111kB audio:0kB global headers:0kB muxing overhead 0.128646% -
FFMPEG options for video streaming
26 février 2014, par YorgZI am trying to use ffmpeg to stream video using ffserver. You will find below the ffserver1.conf file, and the log output from the ffmpeg command.
One of the errors references presets, and everytime I try to use presets I get the error "File not found, even after copying all the preset files in the current directory.
Thanks for the help.
YorgZ
FFSERVER CONF
YorgZ-Macbook$cat ffserver1.conf
Port 8090
BindAddress 0.0.0.0
MaxHTTPConnections 2000
MaxClients 1000
MaxBandwidth 4000
CustomLog -
<feed>
File feed1.ffm
FileMaxSize 1G
ACL allow 127.0.0.1
ACL allow localhost
ACL allow 10.0.0.0 10.0.255.255
</feed>
<stream>
Feed feed1.ffm
Format mp4
VideoFrameRate 29.97
VideoBitRate 500
VideoSize 640x352
</stream>
<stream>
Format status
ACL allow localhost
ACL allow 10.0.0.0 10.0.255.255
</stream>
YorgZ-Macbook$
FFMPEG COMMAND AND LOG
YorgZ-Macbook$./ffmpeg -loglevel debug -i TestStream.mp4 -codec:v libx264 -b:v 500k -vf "scale=640:352" -r 29.97 -codec:a aac -b:a 128k http://127.0.0.1:8090/feed1.ffm
ffmpeg version 2.1.3-tessus Copyright (c) 2000-2013 the FFmpeg developers
built on Jan 16 2014 13:50:59 with llvm-gcc 4.2.1 (LLVM build 2336.1.00)
configuration: --prefix=/Users/tessus/data/ext/ffmpeg/sw --as=yasm --extra-version=tessus --disable-shared --enable-static --disable-ffplay --enable-gpl --enable-pthreads --enable-postproc --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-libspeex --enable-bzlib --enable-zlib --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libxavs --enable-version3 --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvpx --enable-libgsm --enable-libopus --enable-fontconfig --enable-libfreetype --enable-libass --enable-libbluray --enable-filters --enable-runtime-cpudetect
libavutil 52. 48.101 / 52. 48.101
libavcodec 55. 39.101 / 55. 39.101
libavformat 55. 19.104 / 55. 19.104
libavdevice 55. 5.100 / 55. 5.100
libavfilter 3. 90.100 / 3. 90.100
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
Splitting the commandline.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument 'debug'.
Reading option '-i' ... matched as input file with argument 'TestStream.mp4'.
Reading option '-codec:v' ... matched as option 'codec' (codec name) with argument 'libx264'.
Reading option '-b:v' ... matched as option 'b' (video bitrate (please use -b:v)) with argument '500k'.
Reading option '-vf' ... matched as option 'vf' (set video filters) with argument 'scale=640:352'.
Reading option '-r' ... matched as option 'r' (set frame rate (Hz value, fraction or abbreviation)) with argument '29.97'.
Reading option '-codec:a' ... matched as option 'codec' (codec name) with argument 'aac'.
Reading option '-b:a' ... matched as option 'b' (video bitrate (please use -b:v)) with argument '128k'.
Reading option 'http://127.0.0.1:8090/feed1.ffm' ... matched as output file.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option loglevel (set logging level) with argument debug.
Successfully parsed a group of options.
Parsing a group of options: input file TestStream.mp4.
Successfully parsed a group of options.
Opening an input file: TestStream.mp4.
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x10201a200] Format mov,mp4,m4a,3gp,3g2,mj2 probed with size=2048 and score=100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x10201a200] ISO: File Type Major Brand: mp42
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x10201a200] File position before avformat_find_stream_info() is 33783
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x10201a200] All info found
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x10201a200] File position after avformat_find_stream_info() is 64138
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'TestStream.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2014-02-17 10:17:06
Duration: 00:01:40.10, start: 0.000000, bitrate: 582 kb/s
Stream #0:0(und), 15, 1/30000: Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 1001/60000, 483 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und), 1, 1/44100: Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 95 kb/s (default)
Metadata:
creation_time : 2014-02-17 10:17:06
handler_name : IsoMedia File Produced by Google, 5-11-2011
Successfully opened the file.
Parsing a group of options: output file http://127.0.0.1:8090/feed1.ffm.
Applying option codec:v (codec name) with argument libx264.
Applying option b:v (video bitrate (please use -b:v)) with argument 500k.
Applying option vf (set video filters) with argument scale=640:352.
Applying option r (set frame rate (Hz value, fraction or abbreviation)) with argument 29.97.
Applying option codec:a (codec name) with argument aac.
Applying option b:a (video bitrate (please use -b:v)) with argument 128k.
Successfully parsed a group of options.
Opening an output file: http://127.0.0.1:8090/feed1.ffm.
[ffm @ 0x102037200] Format ffm probed with size=2048 and score=101
[AVIOContext @ 0x101d04fe0] Statistics: 4096 bytes read, 0 seeks
Mon Feb 24 11:53:05 2014 127.0.0.1 - - [GET] "/feed1.ffm HTTP/1.1" 200 4175
Successfully opened the file.
detected 8 logical cores
[graph 0 input from stream 0:1 @ 0x101d05a20] Setting 'time_base' to value '1/44100'
[graph 0 input from stream 0:1 @ 0x101d05a20] Setting 'sample_rate' to value '44100'
[graph 0 input from stream 0:1 @ 0x101d05a20] Setting 'sample_fmt' to value 'fltp'
[graph 0 input from stream 0:1 @ 0x101d05a20] Setting 'channel_layout' to value '0x3'
[graph 0 input from stream 0:1 @ 0x101d05a20] tb:1/44100 samplefmt:fltp samplerate:44100 chlayout:0x3
[audio format for output stream 0:0 @ 0x102d004e0] Setting 'sample_fmts' to value 's16'
[audio format for output stream 0:0 @ 0x102d004e0] Setting 'sample_rates' to value '22050'
[audio format for output stream 0:0 @ 0x102d004e0] Setting 'channel_layouts' to value '0x4'
[audio format for output stream 0:0 @ 0x102d004e0] auto-inserting filter 'auto-inserted resampler 0' between the filter 'Parsed_anull_0' and the filter 'audio format for output stream 0:0'
[AVFilterGraph @ 0x101d03ea0] query_formats: 4 queried, 6 merged, 3 already done, 0 delayed
0.500000 0.500000
[auto-inserted resampler 0 @ 0x102d00ca0] ch:2 chl:stereo fmt:fltp r:44100Hz -> ch:1 chl:mono fmt:s16 r:22050Hz
[graph 1 input from stream 0:0 @ 0x103b003a0] Setting 'video_size' to value '640x360'
[graph 1 input from stream 0:0 @ 0x103b003a0] Setting 'pix_fmt' to value '0'
[graph 1 input from stream 0:0 @ 0x103b003a0] Setting 'time_base' to value '1/30000'
[graph 1 input from stream 0:0 @ 0x103b003a0] Setting 'pixel_aspect' to value '1/1'
[graph 1 input from stream 0:0 @ 0x103b003a0] Setting 'sws_param' to value 'flags=2'
[graph 1 input from stream 0:0 @ 0x103b003a0] Setting 'frame_rate' to value '30000/1001'
[graph 1 input from stream 0:0 @ 0x103b003a0] w:640 h:360 pixfmt:yuv420p tb:1/30000 fr:30000/1001 sar:1/1 sws_param:flags=2
[scaler for output stream 0:1 @ 0x103b00900] Setting 'w' to value '640'
[scaler for output stream 0:1 @ 0x103b00900] Setting 'h' to value '352'
[scaler for output stream 0:1 @ 0x103b00900] Setting 'flags' to value '0x4'
[scaler for output stream 0:1 @ 0x103b00900] w:640 h:352 flags:'0x4' interl:0
[format @ 0x103b00dc0] compat: called with args=[yuv420p|yuvj420p|yuv422p|yuvj422p|yuv444p|yuvj444p|nv12|nv16]
[format @ 0x103b00dc0] Setting 'pix_fmts' to value 'yuv420p|yuvj420p|yuv422p|yuvj422p|yuv444p|yuvj444p|nv12|nv16'
[AVFilterGraph @ 0x102d00fc0] query_formats: 5 queried, 4 merged, 0 already done, 0 delayed
[scaler for output stream 0:1 @ 0x103b00900] w:640 h:360 fmt:yuv420p sar:1/1 -> w:640 h:352 fmt:yuv420p sar:44/45 flags:0x4
[libx264 @ 0x102049800] broken ffmpeg default settings detected
[libx264 @ 0x102049800] use an encoding preset (e.g. -vpre medium)
[libx264 @ 0x102049800] preset usage: -vpre <speed> -vpre <profile>
[libx264 @ 0x102049800] speed presets are listed in x264 --help
[libx264 @ 0x102049800] profile is optional; x264 defaults to high
Output #0, ffm, to 'http://127.0.0.1:8090/feed1.ffm':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : now
Stream #0:0(und), 0, 1/1000000: Audio: aac (libvo_aacenc), 22050 Hz, mono, s16, 128 kb/s (default)
Metadata:
creation_time : 2014-02-17 10:17:06
handler_name : IsoMedia File Produced by Google, 5-11-2011
Stream #0:1(und), 0, 1/1000000: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 640x352 [SAR 44:45 DAR 16:9], 1001/30000, q=2-31, 500 kb/s, 1000k tbn, 29.97 tbc (default)
Metadata:
handler_name : VideoHandler
Stream mapping:
Stream #0:1 -> #0:0 (aac -> libvo_aacenc)
Stream #0:0 -> #0:1 (h264 -> libx264)
Error while opening encoder for output stream #0:1 - maybe incorrect parameters such as bit_rate, rate, width or height
[AVIOContext @ 0x101d04fe0] Statistics: 0 seeks, 0 writeouts
[AVIOContext @ 0x101d03fa0] Statistics: 65536 bytes read, 0 seeks
Mon Feb 24 11:53:05 2014 127.0.0.1 - - [POST] "/feed1.ffm HTTP/1.1" 200 0
YorgZ-Macbook$
</profile></speed> -
Recording video on Android using JavaCV (Updated 2014 02 17)
25 septembre 2014, par Fabio BergmannI’m trying to record a video in Android using the JavaCV lib.
I need to record the video in 640x360.I have installed everything as described in README.txt file and I followed the example as below :
https://code.google.com/p/javacv/source/browse/samples/RecordActivity.java
In this example, the video size is this :
private int imageWidth = 320 ;
private int imageHeight = 240 ;In my case, I need to record a video in 640x360 H.264.
(UPDATE) I have reverted my code and kept exactly like in the example, just changing imageWidth and imageHeight to 640x360.
Now I’m getting the video like this image :
http://bergmann.net.br/img/screenshot_video_error.pngHere is my code :
import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U;
import java.io.IOException;
import java.nio.ShortBuffer;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
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.PowerManager;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.autosonvideo.helpers.Helpers;
import com.autosonvideo.logic.CameraHelpers;
import com.googlecode.javacv.FFmpegFrameRecorder;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
public class FFmpegRecordActivity extends Activity implements OnClickListener {
private final static String CLASS_LABEL = "RecordActivity";
private final static String LOG_TAG = CLASS_LABEL;
private PowerManager.WakeLock mWakeLock;
private String ffmpeg_link;
long startTime = 0;
boolean recording = false;
private volatile FFmpegFrameRecorder recorder;
private boolean isPreviewOn = false;
private int sampleAudioRateInHz = 44100;
private int imageWidth = 640;
private int imageHeight = 480;
private int finalImageWidth = 640;
private int finalImageHeight = 360;
private int frameRate = 30;
/* audio data getting thread */
private AudioRecord audioRecord;
private AudioRecordRunnable audioRecordRunnable;
private Thread audioThread;
volatile boolean runAudioThread = true;
/* video data getting thread */
private Camera cameraDevice;
private CameraView cameraView;
private IplImage yuvIplimage = null;
/* layout setting */
private final int bg_screen_bx = 232;
private final int bg_screen_by = 128;
private final int bg_screen_width = 700;
private final int bg_screen_height = 500;
private final int bg_width = 1123;
private final int bg_height = 715;
private final int live_width = 1280;
private final int live_height = 960;
private int screenWidth, screenHeight;
private Button btnRecorderControl;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.main);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
CLASS_LABEL);
mWakeLock.acquire();
initLayout();
initRecorder();
}
@Override
protected void onResume() {
super.onResume();
if (mWakeLock == null) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
CLASS_LABEL);
mWakeLock.acquire();
}
}
@Override
protected void onPause() {
super.onPause();
if (mWakeLock != null) {
mWakeLock.release();
mWakeLock = null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
recording = false;
if (cameraView != null) {
cameraView.stopPreview();
cameraDevice.release();
cameraDevice = null;
}
if (mWakeLock != null) {
mWakeLock.release();
mWakeLock = null;
}
}
private void initLayout() {
/* get size of screen */
Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
RelativeLayout.LayoutParams layoutParam = null;
LayoutInflater myInflate = null;
myInflate = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
RelativeLayout topLayout = new RelativeLayout(this);
setContentView(topLayout);
LinearLayout preViewLayout = (LinearLayout) myInflate.inflate(
R.layout.main, null);
layoutParam = new RelativeLayout.LayoutParams(screenWidth, screenHeight);
topLayout.addView(preViewLayout, layoutParam);
/* add control button: start and stop */
btnRecorderControl = (Button) findViewById(R.id.recorder_control);
btnRecorderControl.setText("Start");
btnRecorderControl.setOnClickListener(this);
/* add camera view */
int display_width_d = (int) (1.0 * bg_screen_width * screenWidth / bg_width);
int display_height_d = (int) (1.0 * bg_screen_height * screenHeight / bg_height);
int prev_rw, prev_rh;
if (1.0 * display_width_d / display_height_d > 1.0 * live_width
/ live_height) {
prev_rh = display_height_d;
prev_rw = (int) (1.0 * display_height_d * live_width / live_height);
} else {
prev_rw = display_width_d;
prev_rh = (int) (1.0 * display_width_d * live_height / live_width);
}
layoutParam = new RelativeLayout.LayoutParams(prev_rw, prev_rh);
layoutParam.topMargin = (int) (1.0 * bg_screen_by * screenHeight / bg_height);
layoutParam.leftMargin = (int) (1.0 * bg_screen_bx * screenWidth / bg_width);
cameraDevice = Camera.open();
Log.i(LOG_TAG, "cameara open");
cameraView = new CameraView(this, cameraDevice);
topLayout.addView(cameraView, layoutParam);
Log.i(LOG_TAG, "cameara preview start: OK");
}
// ---------------------------------------
// initialize ffmpeg_recorder
// ---------------------------------------
private void initRecorder() {
Log.w(LOG_TAG, "init recorder");
if (yuvIplimage == null) {
yuvIplimage = IplImage.create(finalImageWidth, finalImageHeight,
IPL_DEPTH_8U, 2);
Log.i(LOG_TAG, "create yuvIplimage");
}
ffmpeg_link = CameraHelpers.getOutputMediaFile(
CameraHelpers.MEDIA_TYPE_VIDEO).toString();
Log.i(LOG_TAG, "ffmpeg_url: " + ffmpeg_link);
recorder = new FFmpegFrameRecorder(ffmpeg_link, finalImageWidth,
finalImageHeight, 1);
recorder.setFormat("mp4");
recorder.setSampleRate(sampleAudioRateInHz);
// Set in the surface changed method
recorder.setFrameRate(frameRate);
Log.i(LOG_TAG, "recorder initialize success");
audioRecordRunnable = new AudioRecordRunnable();
audioThread = new Thread(audioRecordRunnable);
}
public void startRecording() {
try {
recorder.start();
startTime = System.currentTimeMillis();
recording = true;
audioThread.start();
} catch (FFmpegFrameRecorder.Exception e) {
e.printStackTrace();
}
}
public void stopRecording() {
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) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (recording) {
stopRecording();
}
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
// ---------------------------------------------
// audio thread, gets and encodes audio data
// ---------------------------------------------
class AudioRecordRunnable implements Runnable {
@Override
public void run() {
android.os.Process
.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
// Audio
int bufferSize;
short[] audioData;
int bufferReadResult;
bufferSize = AudioRecord
.getMinBufferSize(sampleAudioRateInHz,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleAudioRateInHz, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize);
audioData = new short[bufferSize];
Log.d(LOG_TAG, "audioRecord.startRecording()");
audioRecord.startRecording();
/* ffmpeg_audio encoding loop */
while (runAudioThread) {
// Log.v(LOG_TAG,"recording? " + recording);
bufferReadResult = audioRecord.read(audioData, 0,
audioData.length);
if (bufferReadResult > 0) {
Log.v(LOG_TAG, "bufferReadResult: " + bufferReadResult);
// If "recording" isn't true when start this thread, it
// never get's set according to this if statement...!!!
// Why? Good question...
if (recording) {
try {
recorder.record(ShortBuffer.wrap(audioData, 0,
bufferReadResult));
// Log.v(LOG_TAG,"recording " + 1024*i + " to " +
// 1024*i+1024);
} catch (FFmpegFrameRecorder.Exception e) {
Log.v(LOG_TAG, e.getMessage());
e.printStackTrace();
}
}
}
}
Log.v(LOG_TAG, "AudioThread Finished, release audioRecord");
/* encoding finish, release recorder */
if (audioRecord != null) {
audioRecord.stop();
audioRecord.release();
audioRecord = null;
Log.v(LOG_TAG, "audioRecord released");
}
}
}
// ---------------------------------------------
// camera thread, gets and encodes video data
// ---------------------------------------------
class CameraView extends SurfaceView implements SurfaceHolder.Callback,
PreviewCallback {
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraView(Context context, Camera camera) {
super(context);
Log.w("camera", "camera view");
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(CameraView.this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mCamera.setPreviewCallback(CameraView.this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
stopPreview();
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.v(LOG_TAG, "Setting imageWidth: " + imageWidth
+ " imageHeight: " + imageHeight + " frameRate: "
+ frameRate);
Camera.Parameters camParams = mCamera.getParameters();
camParams.setPreviewSize(imageWidth, imageHeight);
Log.v(LOG_TAG,
"Preview Framerate: " + camParams.getPreviewFrameRate());
camParams.setPreviewFrameRate(frameRate);
mCamera.setParameters(camParams);
startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
try {
mHolder.addCallback(null);
mCamera.setPreviewCallback(null);
} catch (RuntimeException e) {
// The camera has probably just been released, ignore.
}
}
public void startPreview() {
if (!isPreviewOn && mCamera != null) {
isPreviewOn = true;
mCamera.startPreview();
}
}
public void stopPreview() {
if (isPreviewOn && mCamera != null) {
isPreviewOn = false;
mCamera.stopPreview();
}
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
/* get video data */
if (yuvIplimage != null && recording) {
// yuvIplimage.getByteBuffer().put(data);
final int startY = 640 * (480 - 360) / 2;
final int lenY = 640 * 360;
yuvIplimage.getByteBuffer().put(data, startY, lenY);
final int startVU = 640 * 480 + 320 * 2 * (240 - 180) / 2;
final int lenVU = 320 * 180 * 2;
yuvIplimage.getByteBuffer().put(data, startVU, lenVU);
Log.v(LOG_TAG, "Writing Frame");
try {
long t = 1000 * (System.currentTimeMillis() - startTime);
if (t > recorder.getTimestamp()) {
recorder.setTimestamp(t);
}
recorder.record(yuvIplimage);
} catch (FFmpegFrameRecorder.Exception e) {
Log.v(LOG_TAG, e.getMessage());
e.printStackTrace();
}
}
}
}
@Override
public void onClick(View v) {
if (!recording) {
startRecording();
Log.w(LOG_TAG, "Start Button Pushed");
btnRecorderControl.setText("Stop");
} else {
// This will trigger the audio recording loop to stop and then set
// isRecorderStart = false;
stopRecording();
Log.w(LOG_TAG, "Stop Button Pushed");
btnRecorderControl.setText("Start");
}
}
}