当前位置:首页 » 安卓系统 » android获取视频

android获取视频

发布时间: 2022-08-24 00:50:42

Ⅰ android怎么获取手机本地视频

一部分手机将eMMC存储挂载到 /mnt/external_sd 、/mnt/sdcard2 等节点,而将外置的SD卡挂载到Environment.getExternalStorageDirectory()这个结点,此时,调用Environment.getExternalStorageDirectory(),则返回外置的SD的路径。
而另一部分手机直接将eMMC存储挂载在Environment.getExternalStorageDirectory()这个节点,而将真正的外置SD卡挂载到/mnt/external_sd、/mnt/sdcard2 等节点。此时,调用Environment.getExternalStorageDirectory(),则返回内置的SD的路径。
我们只说第一种情况,并且视频文件在/Sdcard下面
String path = Environment.getExternalStorageDirectory().getPath() + "/文件所在子目录/../你的文件名.*";

String path2 = "file:///sdcard/../文件.*";

File file = new File("/sdcard/../文件.*");

//加载视频:
VideoView videoView = (VideoView)findViewById(R.id.

Ⅱ Android 中实时获取户外监控摄像头的视频信息怎么做

Android中实时获取户外监控摄像头的视频信息的方法为:
1、使用FFMpeg进行视频采集,使用Live555进行RTP传输,使用VideoView进行播放。
csdn提到:重载FrameSource,写一个服务类,可以从FrameSource的派生类读取帧数据,转发给live555.
评价:本方案大型访问量大的不行,少量连接比如100以内的可以。
2、用gstreamer完成采集、编码、组播。客户端使用VideoView进行播放。
评价:本方案优点为可以实现大访问量。缺点是基本从底层架构,代码量比较大。
3、使用FFmpeg进行视频采集,使用ffserver进行视频转发,客户端使用VideoView播放。
评价:优点是实现简单、容易演示,缺点是实时性不好以及用户量大不行。

Ⅲ android如何快速获取指定路径下的视频文件并返回集合

java">/data/data/com.android.providers.media/databases
internal.db
external-XXXX.db

参考:http://blog.csdn.net/fengye810130/article/details/11522741

Ⅳ android 中如何实现查找本地的视频文件,,求大神指点

如果手机自带的文件管理应用没有的话可以用第三方应用
比如 ES文件浏览器 QQ

ES文件管理器 有自动获取视频目录的功能 Android有个机制 系统库 就是把相同类型的文件归类到一起 方便查找
除了Android 其实几乎linux内核的系统都是这么做的 比如Ubuntu iOS等
windows系统从windows7开始引入了 库 这个东西 也是这种样子的

Ⅳ android之前用的MediaStore获取视频,但是获取的视频信息非常不准确,根本没法用,请问有什么好的方法吗

可以使用 jiecaovideoplayer,非常简单好用,功能强大
好用的视频播放库---jiecaovideoplayer推荐
http://www.apkbus.com/thread-307364-1-1.html

Ⅵ Android MediaCodec surface模式下如何读取原始视频数据

Android 用MediaCodec实现视频硬解码
本文向你讲述如何用android标准的API (MediaCodec)实现视频的硬件编解码。例程将从摄像头采集视频开始,然后进行H264编码,再解码,然后显示。我将尽量讲得简短而清晰,不展示那些不相关的代码。但是,我不建议你读这篇文章,也不建议你开发这类应用,而应该转而开发一些戳鱼、打鸟、其乐融融的程序。好吧,下面的内容是写给那些执迷不悟的人的,看完之后也许你会同意我的说法:Android只是一个玩具,很难指望它来做靠谱的应用。
1、从摄像头采集视频
可以通过摄像头Preview的回调,来获取视频数据。
首先创建摄像头,并设置参数:

[java] view plain
cam = Camera.open();
cam.setPreviewDisplay(holder);
Camera.Parameters parameters = cam.getParameters();
parameters.setFlashMode("off"); // 无闪光灯
parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO);
parameters.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
parameters.setPreviewFormat(ImageFormat.YV12);
parameters.setPictureSize(camWidth, camHeight);
parameters.setPreviewSize(camWidth, camHeight);
//这两个属性 如果这两个属性设置的和真实手机的不一样时,就会报错
cam.setParameters(parameters);
宽度和高度必须是摄像头支持的尺寸,否则会报错。要获得所有支持的尺寸,可用getSupportedPreviewSizes,这里不再累述。据说所有的参数必须设全,漏掉一个就可能报错,不过只是据说,我只设了几个属性也没出错。 然后就开始Preview了:

[java] view plain
buf = new byte[camWidth * camHeight * 3 / 2];
cam.addCallbackBuffer(buf);
cam.setPreviewCallbackWithBuffer(this);
cam.startPreview();
setPreviewCallbackWithBuffer是很有必要的,不然每次回调系统都重新分配缓冲区,效率会很低。

在onPreviewFrame中就可以获得原始的图片了(当然,this 肯定要 implements PreviewCallback了)。这里我们是把它传给编码器:

[java] view plain
public void onPreviewFrame(byte[] data, Camera camera) {
if (frameListener != null) {
frameListener.onFrame(data, 0, data.length, 0);
}
cam.addCallbackBuffer(buf);
}
2、编码

首先要初始化编码器:

[java] view plain
mediaCodec = MediaCodec.createEncoderByType("Video/AVC");
MediaFormat mediaFormat = MediaFormat.createVideoFormat(type, width, height);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mediaCodec.start();

然后就是给他喂数据了,这里的数据是来自摄像头的:

[java] view plain
public void onFrame(byte[] buf, int offset, int length, int flag) {
ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers();
int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0)
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(buf, offset, length);
mediaCodec.queueInputBuffer(inputBufferIndex, 0, length, 0, 0);
}
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo,0);
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
if (frameListener != null)
frameListener.onFrame(outputBuffer, 0, length, flag);
mediaCodec.releaseOutputBuffer(outputBufferIndex, false);
outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
}
先把来自摄像头的数据喂给它,然后从它里面取压缩好的数据喂给解码器。
3、解码和显示
首先初始化解码器:

[java] view plain
mediaCodec = MediaCodec.createDecoderByType("Video/AVC");
MediaFormat mediaFormat = MediaFormat.createVideoFormat(mime, width, height);
mediaCodec.configure(mediaFormat, surface, null, 0);
mediaCodec.start();

这里通过给解码器一个surface,解码器就能直接显示画面。
然后就是处理数据了:

[java] view plain
public void onFrame(byte[] buf, int offset, int length, int flag) {
ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
inputBuffer.put(buf, offset, length);
mediaCodec.queueInputBuffer(inputBufferIndex, 0, length, mCount * 1000000 / FRAME_RATE, 0);
mCount++;
}

MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo,0);
while (outputBufferIndex >= 0) {
mediaCodec.releaseOutputBuffer(outputBufferIndex, true);
outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
}
}
queueInputBuffer第三个参数是时间戳,其实怎么写都无所谓,只要是按时间线性增加的就可以,这里就随便弄一个了。后面一段的代码就是把缓冲区给释放掉,因为我们直接让解码器显示,就不需要解码出来的数据了,但是必须要这么释放一下,否则解码器始终给你留着,内存就该不够用了。

好了,到现在,基本上就可以了。如果你运气够好,现在就能看到视频了,比如在我的三星手机上这样就可以了。但是,我试过几个其他平台,多数都不可以,总是有各种各样的问题,如果要开发一个不依赖平台的应用,还有很多的问题要解决。说说我遇到的一些情况:

1、视频尺寸
一般都能支持176X144/352X288这种尺寸,但是大一些的,640X480就有很多机子不行了,至于为什么,我也不知道。当然,这个尺寸必须和摄像头预览的尺寸一致,预览的尺寸可以枚举一下。
2、颜色空间
根据ANdroid SDK文档,确保所有硬件平台都支持的颜色,在摄像头预览输出是YUV12,在编码器输入是COLOR_FormatYUV420Planar,也就是前面代码中设置的那样。 不过,文档终究是文档,否则安卓就不是安卓。
在有的平台上,这两个颜色格式是一样的,摄像头的输出可以直接作为编码器的输入。也有的平台,两个是不一样的,前者就是YUV12,后者等于I420,需要把前者的UV分量颠倒一下。下面的代码效率不高,可供参考。

[java] view plain
byte[] i420bytes = null;
private byte[] swapYV12toI420(byte[] yv12bytes, int width, int height) {
if (i420bytes == null)
i420bytes = new byte[yv12bytes.length];
for (int i = 0; i < width*height; i++)
i420bytes[i] = yv12bytes[i];
for (int i = width*height; i < width*height + (width/2*height/2); i++)
i420bytes[i] = yv12bytes[i + (width/2*height/2)];
for (int i = width*height + (width/2*height/2); i < width*height + 2*(width/2*height/2); i++)
i420bytes[i] = yv12bytes[i - (width/2*height/2)];
return i420bytes;
}
这里的困难是,我不知道怎样去判断是否需要这个转换。据说,Android 4.3不用再从摄像头的PreView里面取图像,避开了这个问题。这里有个例子,虽然我没读,但看起来挺厉害的样子,应该不会有错吧(觉厉应然)。http://bigflake.com/mediacodec/CameraToMpegTest.java.txt

3、输入输出缓冲区的格式
SDK里并没有规定格式,但是,这种情况H264的格式基本上就是附录B。但是,也有比较有特色的,它就是不带那个StartCode,就是那个0x000001,搞得把他编码器编出来的东西送给他的解码器,他自己都解不出来。还好,我们可以自己加。

[java] view plain
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
byte[] outData = new byte[bufferInfo.size + 3];
outputBuffer.get(outData, 3, bufferInfo.size);
if (frameListener != null) {
if ((outData[3]==0 && outData[4]==0 && outData[5]==1)
|| (outData[3]==0 && outData[4]==0 && outData[5]==0 && outData[6]==1))
{
frameListener.onFrame(outData, 3, outData.length-3, bufferInfo.flags);
}
else
{
outData[0] = 0;
outData[1] = 0;
outData[2] = 1;
frameListener.onFrame(outData, 0, outData.length, bufferInfo.flags);
}
}

4、有时候会死在dequeueInputBuffer(-1)上面

根据SDK文档,dequeueInputBuffer 的参数表示等待的时间(毫秒),-1表示一直等,0表示不等。按常理传-1就行,但实际上在很多机子上会挂掉,没办法,还是传0吧,丢帧总比挂掉好。当然也可以传一个具体的毫秒数,不过没什么大意思吧。

Ⅶ Android中怎么逐帧读取一段视频

我用的是Kmplayer,很有名的一款视频播放器,网络下就有了,我一直在用。
1.打开你想要从中截取gif的电影或视频,手动调节播放器到你需要截取的那一段(按F键可以一帧一帧的微调),然后暂停。
2.右键点击出现菜单,选择 【捕获】-【画面:高级捕获】调出【帧模式】窗口(或直接按快捷键Ctrl + G)
3.在帧模式窗口中先选择你想要截图保存的位置,在“要捕获的数量”里面选择【连续】,“要捕获的帧”选择【所有帧】。如果影片清晰度高,那么“捕获尺寸”选【原始尺寸】的话截出来的图就会很大,而且会由于截的图片大变的很卡,有时还会漏帧。再说反正后面做gif的时候还要把图片缩小,所以选择【指定尺寸】,然后把播放器窗口调小一些,点下面的那个,就会自动匹配你当前画面的大小尺寸。
4. 点帧模式窗口中右下方【开始】(此时播放器停止播放的话是不会截图的,开始播放时就会自动逐帧截图),然后再点击播放器开始播放,此时播放器自动进行所有帧抓取存储操作,完成时先点帧模式右下方的【停止】,再点击播放器的停止播放。逐帧截图工作完成。

Ⅷ android怎样获取视频缩略图

需要快速提取图片和视频缩略图可以直接访问 android.provider.MediaStore.Images.Thumbnails 和android.provider.MediaStore.Video.Thumbnails这两个数据库,即可查询出来缩略图 。 如何判断文件呢? 可以通过Cursor遍历数据库,对比INTERNAL_CONTENT_URI字段的值,这是一个Uri,这里保存着Android手机SD卡上的多媒体文件完整路径。 Uri originalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; //若为视频则为MediaStore.Video.Media.EXTERNAL_CONTENT_URI; ContentResolver cr = this.getContentResolver(); Cursor cursor = cr.query(originalUri, null, null, null, null); if (cursor == null) { return; } for (cursor.moveToFirst();!cursor.isAfterLast(); cursor.moveToNext()) { long thumbNailsId = cursor.getLong(cursor .getColumnIndex("_ID")); Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnail(cr, thumbNailsId, Video.Thumbnails.MICRO_KIND, null); //若为视频则为 // Bitmap bitmap = MediaStore.Video.Thumbnails.getThumbnail(cr, // thumbNailsId, Video.Thumbnails.MICRO_KIND, null); return bitmap; }

Ⅸ Android中怎么逐帧读取视频文件

MediaMetadataRetriever media = new MediaMetadataRetriever();
media.setDataSource(”视频的绝对地址“);
Bitmap bitmap = media.getFrameAtTime();
image = (ImageView)this.findViewById(R.id.imageView1);
image.setImageBitmap(bitmap);

这个是获取第一祯的代码,可以参考下

热点内容
粉色的编译器 发布:2025-01-15 14:41:36 浏览:604
数控车床编程加工 发布:2025-01-15 14:31:43 浏览:714
怎么破解iphone5密码 发布:2025-01-15 14:26:48 浏览:434
php数组打印 发布:2025-01-15 14:15:56 浏览:621
java流的关闭 发布:2025-01-15 14:15:55 浏览:755
东东农场自动脚本 发布:2025-01-15 14:10:05 浏览:390
apache禁止访问文件 发布:2025-01-15 14:01:55 浏览:442
速腾哪个配置动力最好 发布:2025-01-15 13:56:44 浏览:902
编程做转盘 发布:2025-01-15 13:56:04 浏览:194
安卓辅助脚本如何写 发布:2025-01-15 13:42:50 浏览:127