A. android中如何将抓取到的视频流转换为能播放的视频格式
不要把分丢掉。扔这里吧a284978383你好,给你推荐一款在线 金达_屏幕录像专家 (软件请网络搜索),金达是一款完全基于Web浏览器的网页版屏幕录像专家。它能够在线录制你的电脑屏幕操作视频,并可即时发布到金达网分享。你还可以设置预览一段时间后必须支付金币才能继续观看,以获得分成收入。 使用金达屏幕录像专家,你无需下载安装(需要java虚拟机的支持),便可以很轻松的在线录制视频教程,支持Windows和Mac系统,支持麦克风声音录入、区域录制等,值得一提的是,金达录制的视频质量非常高,并且可以导出到本地保存。金达网目前已经有网友发布了成千上万的各种视频教程,无论是新手上网、办公应用,还是PS图片、网站编程等,很不错哦,你可以试下~·完全免费的·~~·还能赚钱·~~小知识:扬汤止沸:把锅里开着的水舀起来再倒回去,使它凉下来不沸腾。比喻办法不彻底,不能从根本上解决问题。
B. android手机如何播放mp4
android手机播放MP4视频文件步骤如下:
工具/材料:以小米6手机版为例。权
1、首先打开小米6手机,点击“小米视频”图标,如下图所示;
C. Android如何播放mov格式的视频文件
Android播放“mov”格式的视频文件时,可以借助第三方软件将“mov”格式转换成“mp4”。
此处以微信为例,具体步骤如下:
1、打开安卓手机的微信软件,点开任意聊天框将“mov”格式的视频发送过去。
(3)android读取视频文件扩展阅读:
MP4与MOV的区别:
“mp4”格式的视频相比起“mov”格式的视频体积要小得多,前者格式压缩率相比后者要大得多,虽然相对来说更省存储空间,但画质将会受到影响,很不利于后期编辑和制作,尤其是后期特效和调色。
这一点很像数码相机的RAW格式和jpeg格式,前者为无损压缩格式后者则是有损压缩格式,前者的后期调整余地更大。这也是很多资深的摄影者更愿意用前者拍摄的原因。
D. android视频流处理
从API 8开始,新增了一个类:android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取视频第一帧得到的Bitmap,2个对图片进行缩略处理。public static Bitmap createVideoThumbnail (String filePath, int kind)第一个参数是视频文件的路径,第二个参数是指定图片的大小,有两种选择Thumbnails.MINI_KIND与Thumbnails.MICRO_KIND。第一种文档上说大小是512 x 384 ,我用一个MP4格式文件测试得到544 x 960,用一个wmv格式文件测试得到160 x 120。明显不靠谱。第二种参数两种格式文件得到的大小都是 96 x 96,这个才是缩略图。extractThumbnail(Bitmap source, int width, int height, int options)extractThumbnail(Bitmap source, int width, int height)这两种方法都是用来处理Bitmap的大小的,第一个参数是要处理的Bitmap,第二个参数是处理后宽度,第三个是高度,第四个参数options,如果options定义为OPTIONS_RECYCLE_INPUT,则回收资源。也就是说可以用第三种方法把截取到的视频第一帧的Bitmap转成任意想要的大小,第三个方法还可以获取内存卡内图片的缩略图。Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path1, Thumbnails.MINI_KIND); bitmap = ThumbnailUtils.extractThumbnail(bitmap, 210, 210);从API 10开始新增一类MediaMetadataRetriever可以用来获取媒体文件的信息MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(/sdcard/33.mp4); Bitmap bitmap = mmr.getFrameAtTime(); image.setImageBitmap(bitmap); System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE)+); System.out.println(mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE)+); mmr.release();MediaMetadataRetriever可以获取视频任何一帧的缩略图。 public static Bitmap createVideoThumbnail(String filePath) { // MediaMetadataRetriever is available on API Level 8 // but is hidden until API Level 10 Class clazz = null; Object instance = null; try { clazz = Class.forName(android.media.MediaMetadataRetriever); instance = clazz.newInstance(); Method method = clazz.getMethod(setDataSource, String.class); method.invoke(instance, filePath); // The method name changes between API Level 9 and 10. if (Build.VERSION.SDK_INT <= 9) { return (Bitmap) clazz.getMethod(captureFrame).invoke(instance); } else { byte[] data = (byte[]) clazz.getMethod(getEmbeddedPicture).invoke(instance); if (data != null) { Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); if (bitmap != null) return bitmap; } return (Bitmap) clazz.getMethod(getFrameAtTime).invoke(instance); } } catch (IllegalArgumentException ex) { // Assume this is a corrupt video file } catch (RuntimeException ex) { // Assume this is a corrupt video file. } catch (InstantiationException e) { Log.e(TAG, createVideoThumbnail, e); } catch (InvocationTargetException e) { Log.e(TAG, createVideoThumbnail, e); } catch (ClassNotFoundException e) { Log.e(TAG, createVideoThumbnail, e); } catch (NoSuchMethodException e) { Log.e(TAG, createVideoThumbnail, e); } catch (IllegalAccessException e) { Log.e(TAG, createVideoThumbnail, e); } finally { try { if (instance != null) { clazz.getMethod(release).invoke(instance); } } catch (Exception ignored) { } } return null; }
E. android开发 关于视频 存放位置以及读取方法
LZ应该知道android的四大存储方式,文件系统,数据库,sharepreference和网络存储。如果LZ不愿意放到asssets或者raw里面,那就只有放到那四个里面去了,看LZ自己取舍把
F. Android MediaCodec surface模式下如何读取原始视频数据
Android 用MediaCodec实现视频硬解码本文向你讲述如何用android标准的API (MediaCodec)实现视频的硬件编解码。例程将从摄像头采集视频开始,然后进行H264编码,再解码,然后显示。我将尽量讲得简短而清晰,不展示那些不相关的代码。但是,我不建议你读这篇文章,也不建议你开发这类应用,而应该转而开发一些戳鱼、打鸟、其乐融融的程序。好吧,下面的内容是写给那些执迷不悟的人的,看完之后也许你会同意我的说法:Android只是一个玩具,很难指望它来做靠谱的应用。1、从摄像头采集视频可以通过摄像头Preview的回调,来获取视频数据。首先创建摄像头,并设置参数:[java] view plaincam = 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 plainbuf = new byte[camWidth * camHeight * 3 / 2];cam.addCallbackBuffer(buf);cam.setPreviewCallbackWithBuffer(this);cam.startPreview();setPreviewCallbackWithBuffer是很有必要的,不然每次回调系统都重新分配缓冲区,效率会很低。在onPreviewFrame中就可以获得原始的图片了(当然,this 肯定要 implements PreviewCallback了)。这里我们是把它传给编码器:[java] view plainpublic void onPreviewFrame(byte[] data, Camera camera) {if (frameListener != null) {frameListener.onFrame(data, 0, data.length, 0);}cam.addCallbackBuffer(buf);}2、编码首先要初始化编码器:[java] view plainmediaCodec = 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 plainpublic 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 plainmediaCodec = MediaCodec.createDecoderByType("Video/AVC");MediaFormat mediaFormat = MediaFormat.createVideoFormat(mime, width, height);mediaCodec.configure(mediaFormat, surface, null, 0);mediaCodec.start();这里通过给解码器一个surface,解码器就能直接显示画面。然后就是处理数据了:[java] view plainpublic 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 plainbyte[] 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.txt3、输入输出缓冲区的格式SDK里并没有规定格式,但是,这种情况H264的格式基本上就是附录B。但是,也有比较有特色的,它就是不带那个StartCode,就是那个0x000001,搞得把他编码器编出来的东西送给他的解码器,他自己都解不出来。还好,我们可以自己加。[java] view plainByteBuffer 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吧,丢帧总比挂掉好。当然也可以传一个具体的毫秒数,不过没什么大意思吧。
G. Android中怎么逐帧读取视频文件
MediaMetadataRetriever media = new MediaMetadataRetriever();media.setDataSource(”视频的绝对地址“);Bitmap bitmap = media.getFrameAtTime();image = (ImageView)this.findViewById(R.id.imageView1);image.setImageBitmap(bitmap);这个是获取第一祯的代码,可以参考下
H. 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.
I. android如何快速获取指定路径下的视频文件并返回集合
/data/data/com.android.providers.media/databasesinternal.dbexternal-XXXX.db
参考:http://blog.csdn.net/fengye810130/article/details/11522741
未经允许不得转载:山九号 » android读取视频文件|android手机如何播放mp4