我正在使用相机的previewCallback尝试抓取图像.这是我正在使用的代码
private Camera.PreviewCallback mPrevCallback = new Camera.PreviewCallback()
{
public void onPreviewFrame( byte[] data, Camera Cam ) {
Log.d("CombineTestActivity", "Preview started");
Log.d("CombineTestActivity", "Data length = "
+ data.length );
currentprev = BitmapFactory.decodeByteArray( data, 0,
data.length );
if( currentprev == null )
Log.d("CombineTestActivity", "currentprev is null" );
Log.d("CombineTestActivity", "Preview Finished" );
}
};
Run Code Online (Sandbox Code Playgroud)
数据的长度总是与576000相同.
此外,我尝试更改相机的参数,以便图像以不同的格式返回.这就是我这样做时的样子.
mCamera = Camera.open();
camParam = mCamera.getParameters();
camParam.setPreviewFormat( ImageFormat.RGB_565 );
mCamera.setParameters( camParam );
mCamera.setPreviewCallback( mPrevCallback );
Run Code Online (Sandbox Code Playgroud)
但是,当我更改预览格式并将其保留为默认值NV21时,BitmapFactory.decodeByteArray将返回null.我也尝试将预览格式更改为JPEG类型.我甚至在ddms中得到了一个调试语句,这就是我得到的
"D/skia(14391):--- SkImageDecoder :: Factory返回null"
我尝试使用互联网上提供的示例示例中的FFMpeg库解码视频,我用新版本的ffmpeg搞清楚,这是我从我的类文件中调用的代码,
private static native int decodeVideo(String filename);
decodeVideo(getString(R.string._sdcard_abc_3gp));
Run Code Online (Sandbox Code Playgroud)
现在位于JNI目录的.c文件中,我写了这段代码,
jint Java_ru_dzakhov_ffmpeg_test_MainActivity_decodeVideo(JNIEnv* env, jobject
javaThis,jstring filename) {
AVFormatContext *pFormatCtx;
int i, videoStream;
AVCodecContext *pCodecCtx;
AVCodec *pCodec;
AVFrame *pFrame;
AVFrame *pFrameRGB;
AVPacket packet;
int frameFinished;
int numBytes;
uint8_t *buffer;
// Register all formats and codecs
av_register_all();
// Open video file
const jbyte *str;
str = (*env)->GetStringUTFChars(env, filename, NULL);
if(av_open_input_file(&pFormatCtx, str, NULL, 0, NULL)!=0)
{
LOGI("Can't open file '%s'\n", str);
return 1;
}
else
{
LOGI("File is opened\n");
LOGI("File '%s', Codec %s",pFormatCtx->filename,pFormatCtx->iformat->name);
} …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个应用程序来捕获相机预览帧并将其转换为Android中的位图.这是我的代码:
Camera.PreviewCallback previewCallback = new Camera.PreviewCallback()
{
public void onPreviewFrame(byte[] data, Camera camera)
{
try
{
BitmapFactory.Options opts = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);//,opts);
}
catch(Exception e)
{
}
}
};
mCamera = Camera.open();
mCamera.setPreviewCallback(previewCallback);
Run Code Online (Sandbox Code Playgroud)
在我开始预览之后,使用数据调用回调,但位图为空.
将字节数组转换为BitMap时,我做错了什么?
我想知道是否可以从Android中正在运行的视频中提取帧?我需要定期提取帧并发送它们进行进一步处理.
有人能为我找到答案吗?
谢谢,
ABHI
我录制的视频时间有限.现在我想获取所有视频帧.我使用下面的代码,并使用它,我能够得到帧,但我没有得到所有的视频帧.重复3到4帧然后我有一个不同的帧.但是众所周知,我们可以在一秒钟内获得25-30帧来显示流畅的视频.如何获得所有帧.
for (int i = 0; i < 30; i++) {
Bitmap bArray = mediaMetadataRetriever.getFrameAtTime(
1000000 * i,
MediaMetadataRetriever.OPTION_CLOSEST);
savebitmap(bArray, 33333 * i);
}
Run Code Online (Sandbox Code Playgroud)
我不想使用NDK.我得到这个链接不知道应该是什么值"argb8888".我在这里得到错误.任何人都可以解释如何做到这一点. 从Android中的视频图像中获取帧
我从使用SurfaceView作为相机preivew获取图像/可绘制或位图时遇到了一些麻烦.
final CameraSurfaceView cameraSurfaceView = new CameraSurfaceView(this);
LinearLayout ll = (LinearLayout)findViewById(R.id.linearLayout1);
ll.addView(cameraSurfaceView); // THIS WORKS
ImageView ivCam = (ImageView) findViewById(R.id.ivCam);
ivCam.setImageBitmap(cameraSurfaceView.getDrawingCache()); // THIS DOESN'T :(
Run Code Online (Sandbox Code Playgroud)
有什么建议?谢谢!
编辑:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final CameraSurfaceView cameraSurfaceView = new CameraSurfaceView(this);
LinearLayout ll = (LinearLayout)findViewById(R.id.LLS);
ll.addView(cameraSurfaceView); // THIS WORKS
}
///////////////////////////////////////////////////////////////////////////////////////////////
public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback
{
private SurfaceHolder holder;
private Camera camera;
public CameraSurfaceView(Context context)
{
super(context);
//Initiate the Surface Holder properly
this.holder = this.getHolder();
this.holder.addCallback(this);
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); …
Run Code Online (Sandbox Code Playgroud) 我在android中开发,并希望将字节数组从相机的previewCallback(YUV格式)转换为rgb格式.
我使用了这个答案中给出的功能:从Android中的视频图像中获取帧
它在java中完美运行,但我的问题是我想用c ++编写函数(我使用的是ndk,而不是很熟悉c ++).
我试图用c ++创建函数,但它总是会产生奇怪的结果(例如图片全部为绿色).
有没有人有类似的功能或这个功能在c ++中工作?
谢谢.
我的目标是从相机中获取最大数量的图像而不保存它们,但我不知道如何进行这种操作.我知道如何从拍摄照片的相机中捕捉到一张图像,但是我是如何在不拍照的情况下从相机中获取照片的?
我不会通过互联网发送照片,而是在设备上处理它们.我必须拍摄视频或照片序列吗?