android獲取視頻
Ⅰ 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);
這個是獲取第一禎的代碼,可以參考下