我正在尝试在我的android项目上录制视频。
我在互联网上找到了一些例子但没有任何效果。
Normaly,我必须使用MediaRecorder
你能给我一个简单的例子,我不需要在令牌时可视化视频,只需要在我的SD卡上注册它,就是这样。
以下是我要做的事情的例子:
public class VideoCapture extends Activity {
MediaRecorder recorder;
Button buttonStart = (Button)findViewById(R.id.buttonstart);
Button buttonStop = (Button)findViewById(R.id.buttonstop);
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
recorder = new MediaRecorder();
initRecorder();
}
private void initRecorder() {
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setProfile(cpHigh);
recorder.setOutputFile("/sdcard/videocapture_example.mp4");
recorder.setMaxDuration(50000);
recorder.setMaxFileSize(5000000);
}
private void prepareRecorder() {
try {
recorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
finish();
} catch (IOException e) {
e.printStackTrace();
finish();
}
}
buttonStart.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
initRecorder();
prepareRecorder();
}});
buttonStop.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v)
{
recorder.stop();
}
});
}
堆栈跟踪:
12-25 22:04:24.188: E/AndroidRuntime(1361): FATAL EXCEPTION: main
12-25 22:04:24.188: E/AndroidRuntime(1361): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{test.milos.net/test.milos.net.TestVideoNetActivity}: java.lang.ClassNotFoundException: test.milos.net.TestVideoNetActivity in loader dalvik.system.PathClassLoader[/data/app/test.milos.net-2.apk]
12-25 22:04:24.188: E/AndroidRuntime(1361): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1660)
12-25 22:04:24.188: E/AndroidRuntime(1361): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1752)
12-25 22:04:24.188: E/AndroidRuntime(1361): at android.app.ActivityThread.access$1500(ActivityThread.java:123)
12-25 22:04:24.188: E/AndroidRuntime(1361): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993)
12-25 22:04:24.188: E/AndroidRuntime(1361): at android.os.Handler.dispatchMessage(Handler.java:99)
12-25 22:04:24.188: E/AndroidRuntime(1361): at android.os.Looper.loop(Looper.java:126)
12-25 22:04:24.188: E/AndroidRuntime(1361): at android.app.ActivityThread.main(ActivityThread.java:3997)
12-25 22:04:24.188: E/AndroidRuntime(1361): at java.lang.reflect.Method.invokeNative(Native Method)
12-25 22:04:24.188: E/AndroidRuntime(1361): at java.lang.reflect.Method.invoke(Method.java:491)
12-25 22:04:24.188: E/AndroidRuntime(1361): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
12-25 22:04:24.188: E/AndroidRuntime(1361): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
12-25 22:04:24.188: E/AndroidRuntime(1361): at dalvik.system.NativeStart.main(Native Method)
12-25 22:04:24.188: E/AndroidRuntime(1361): Caused by: java.lang.ClassNotFoundException: test.milos.net.TestVideoNetActivity in loader dalvik.system.PathClassLoader[/data/app/test.milos.net-2.apk]
12-25 22:04:24.188: E/AndroidRuntime(1361): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:251)
12-25 22:04:24.188: E/AndroidRuntime(1361): at java.lang.ClassLoader.loadClass(ClassLoader.java:548)
12-25 22:04:24.188: E/AndroidRuntime(1361): at java.lang.ClassLoader.loadClass(ClassLoader.java:508)
12-25 22:04:24.188: E/AndroidRuntime(1361): at android.app.Instrumentation.newActivity(Instrumentation.java:1022)
12-25 22:04:24.188: E/AndroidRuntime(1361): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
12-25 22:04:24.188: E/AndroidRuntime(1361): ... 11 more
答案 0 :(得分:1)
正如猜测的那样,你做了一些与实际视频录制没有任何关系的错误。
第一个问题:
Button buttonStart = (Button)findViewById(R.id.buttonstart);
Button buttonStop = (Button)findViewById(R.id.buttonstop);
您无法在此处致电findViewById()
。 findViewById()
仅在活动当前视图中搜索层次结构。在你的类被实例化的时候,没有视图层次存在。这些类成员将始终为null,因为如果无法找到该视图,则会返回该成员。您可以保留变量声明,但在致电onCreate()
后将搜索部分移至setContentView()
,例如:
setContentView(R.layout.main);
buttonStart = (Button)findViewById(R.id.buttonstart);
buttonStop = (Button)findViewById(R.id.buttonstop);
同样适用于底部的两个setOnClickListener()
来电。他们必须在一个方法内。在onCreate()
来电之后,我建议将这两个块移到findViewById()
。
编辑:堆栈跟踪表明您的应用尝试运行名为TestVideoNetActivity
的活动。您的实际活动名为VideoCapture
。
打开AndroidManifest并查找如下所示的部分:
<activity
android:name=".TestVideoNetActivity"
... >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
将 TestVideoNetActivity 更改为 VideoCapture 。还要确保你的包匹配,
清单顶部应该有一行package="X"
,java源文件顶部应该有一行package X;
。确保它们具有相同的X值。
编辑2:您的第二个堆栈跟踪表明setAudioSource()
失败。我能想到的是,您没有设置正确的权限来访问麦克风。将以下行添加到您的android-manifest (这也包括相机权限,因为您也需要它):
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
将它们添加到<manifest>
标记内,但在<application>
标记之外。例如。在<uses-sdk>
行之后,如果你有一行(默认包含在内,我相信)。