1. android ffmpeg支持avi嗎
1.把封裝好的視頻數據解碼為YUV
2.YUV數據轉化為RGB。
3.一幀一幀的傳給SurfaceView顯示出來
其實YUV數據可直接在SurfaceView顯示,在研究Android系統多媒體框架的stagefright視頻顯示時發現,根本找不到omx解碼後的yuv是怎麼轉換成RGB的代碼,yuv數據在render之後就找不到去向了,可畫面確確實實的顯示出來了。
稍微看一下AsomePlayer的代碼,不難發現,視頻的每一幀是通過調用了SoftwareRenderer來渲染顯示的、這是一個很大的突破,以後可以直接丟yuv數據到surface顯示,無需耗時耗效率的yuv轉RGB了,這部分知識點會在以後的文章中實現本篇不涉及。
下面看具體實現:
1.首先拷貝一份上一章的代碼命名為ffmpegandroidplayer
2.根據本章需要修改代碼
界面上一個SurfaceView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
一個native 的play方法負責把Surface傳給底層
@Override
public void surfaceCreated(SurfaceHolder holder) {
new Thread(new Runnable() {
@Override
public void run() {
play(surfaceHolder.getSurface());
}
}).start();
}
...
public native int play(Object surface);
3.修改CMakeLists.txt
target_link_libraries( native-lib log android avutil-55 swresample-2 avcodec-57 avfilter-6 swscale-4 avdevice-57 avformat-57
${log-lib} )
4.實現play方法。
寫這里方法的時候報了一個錯,記錄一下。
java.lang.UnsatisfiedLinkError: No implementation found for int com.ws.ffmpegandroidplayer.MainActivity.play
1
1
解決思路:
1、JNIEnv *env參數的使用
所有JNI介面的第一個參數是JNIEnv *env, 在C中,使用方法是
(*env)->NewStringUTF(env, "Hello from JNI!");
但在C++中,其調用方法是
env->NewStringUTF("Hello from JNI!");
為什麼有這種區別呢,看看jni.h中關於JNIEnv的定義就可以知道了:
#if defined(__cplusplus)
typedef _JNIEnv JNIEnv;
#else
typedef const struct JNINativeInterface* JNIEnv;
#endif
可以看到,對於C和C++,定義有所不同,主要原因是C不支持類,所以採用了一種變通的方法。
2、介面找不到
在Java中調用JNI介面時,出現異常,察看日誌,發現有如下錯誤:
WARN/dalvikvm(422): No implementation found for native Lcom/whty/wcity/HelixPlayer;.setDllPath (Ljava/lang/String;)V
檢查了幾遍代碼,Cpp中確實定義了這個介面,而且仔細對照了Java的包名、類名,確實沒有錯誤,那為什麼會出現這種問題呢。後來突然想到,JNI介面 都是以C的方式定義的,現在使用C++實現,函數定義前是否需要加上extern "C"呢?為此定義了一個頭文件,在CPP文件中include該頭文件,頭文件加上如下代碼片斷:
#ifdef __cplusplus
extern "C" {
#endif
#endif
...
#ifdef __cplusplus
Java_com_ws_ffmpegandroidplayer_MainActivity_play源碼如下
#include <jni.h>
#include <android/log.h>
#include <android/native_window.h>
#include <android/native_window_jni.h>
extern "C" {
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
#include "libavutil/imgutils.h"
//};
#define LOG_TAG "ffmpegandroidplayer"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
JNIEXPORT jint JNICALL
Java_com_ws_ffmpegandroidplayer_MainActivity_play
(JNIEnv *env, jclass clazz, jobject surface) {
LOGD("play");
// sd卡中的視頻文件地址,可自行修改或者通過jni傳入
//char *file_name = "/storage/emulated/0/ws2.mp4";
char *file_name = "/storage/emulated/0/video.avi";
av_register_all();
AVFormatContext *pFormatCtx = avformat_alloc_context();
// Open video file
if (avformat_open_input(&pFormatCtx, file_name, NULL, NULL) != 0) {
LOGD("Couldn't open file:%s\n", file_name);
return -1; // Couldn't open file
}
// Retrieve stream information
if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
LOGD("Couldn't find stream information.");
return -1;
}
// Find the first video stream
int videoStream = -1, i;
for (i = 0; i < pFormatCtx->nb_streams; i++) {
if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO
&& videoStream < 0) {
videoStream = i;
}
}
if (videoStream == -1) {
LOGD("Didn't find a video stream.");
return -1; // Didn't find a video stream
}
// Get a pointer to the codec context for the video stream
AVCodecContext *pCodecCtx = pFormatCtx->streams[videoStream]->codec;
// Find the decoder for the video stream
AVCodec *pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
if (pCodec == NULL) {
LOGD("Codec not found.");
return -1; // Codec not found
}
if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
LOGD("Could not open codec.");
return -1; // Could not open codec
}
// 獲取native window
ANativeWindow *nativeWindow = ANativeWindow_fromSurface(env, surface);
// 獲取視頻寬高
int videoWidth = pCodecCtx->width;
int videoHeight = pCodecCtx->height;
// 設置native window的buffer大小,可自動拉伸
ANativeWindow_setBuffersGeometry(nativeWindow, videoWidth, videoHeight,
WINDOW_FORMAT_RGBA_8888);
ANativeWindow_Buffer windowBuffer;
if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) {
LOGD("Could not open codec.");
return -1; // Could not open codec
}
// Allocate video frame
AVFrame *pFrame = av_frame_alloc();
// 用於渲染
AVFrame *pFrameRGBA = av_frame_alloc();
if (pFrameRGBA == NULL || pFrame == NULL) {
LOGD("Could not allocate video frame.");
return -1;
}
// Determine required buffer size and allocate buffer
// buffer中數據就是用於渲染的,且格式為RGBA
int numBytes = av_image_get_buffer_size(AV_PIX_FMT_RGBA, pCodecCtx->width, pCodecCtx->height,
1);
uint8_t *buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));
av_image_fill_arrays(pFrameRGBA->data, pFrameRGBA->linesize, buffer, AV_PIX_FMT_RGBA,
pCodecCtx->width, pCodecCtx->height, 1);
// 由於解碼出來的幀格式不是RGBA的,在渲染之前需要進行格式轉換
struct SwsContext *sws_ctx = sws_getContext(pCodecCtx->width,
pCodecCtx->height,
pCodecCtx->pix_fmt,
pCodecCtx->width,
pCodecCtx->height,
AV_PIX_FMT_RGBA,
SWS_BILINEAR,
NULL,
NULL,
NULL);
int frameFinished;
AVPacket packet;
while (av_read_frame(pFormatCtx, &packet) >= 0) {
// Is this a packet from the video stream?
if (packet.stream_index == videoStream) {
// Decode video frame
avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
// 並不是decode一次就可解碼出一幀
if (frameFinished) {
// lock native window buffer
ANativeWindow_lock(nativeWindow, &windowBuffer, 0);
// 格式轉換
sws_scale(sws_ctx, (uint8_t const *const *) pFrame->data,
pFrame->linesize, 0, pCodecCtx->height,
pFrameRGBA->data, pFrameRGBA->linesize);
// 獲取stride
uint8_t *dst = (uint8_t *) windowBuffer.bits;
int dstStride = windowBuffer.stride * 4;
uint8_t *src = (pFrameRGBA->data[0]);
int srcStride = pFrameRGBA->linesize[0];
// 由於window的stride和幀的stride不同,因此需要逐行復制
int h;
for (h = 0; h < videoHeight; h++) {
memcpy(dst + h * dstStride, src + h * srcStride, srcStride);
}
ANativeWindow_unlockAndPost(nativeWindow);
}
}
av_packet_unref(&packet);
}
av_free(buffer);
av_free(pFrameRGBA);
// Free the YUV frame
av_free(pFrame);
// Close the codecs
avcodec_close(pCodecCtx);
// Close the video file
avformat_close_input(&pFormatCtx);
return 0;
}
}
2. 問題,android如何壓縮視頻文件質量
系統級別的api,只能通過錄制視頻調整分辨了,格式等盡量降低視頻的大小
系統api是沒辦法壓縮視頻大小的,除非使用第三方編譯的庫如FFMPEG,等但是這些都沒有標準的,自己研究需要懂音視頻C代碼
反正很麻煩,我反正沒有在網上找到合適的第三方
3. 如何把ffmpeg移植到android
1
首先把系統環境配置好,一般情況系統默認都會安裝gcc和make編譯工具。若提示未安裝編譯工具,請使用sudo apt-get install build-essential安裝即可。
2
修改編譯後庫的版本號,在ffmpeg目錄下找到configure文件,將下圖所示的4行代碼修改為
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
3
將以下代碼保存到build.sh中
#!/bin/bashNDK=/home/robot/tools/android-ndk-r8eSYSROOT=$NDK/platforms/android-14/arch-arm/TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64
function build_ffmpeg{./configure \ --prefix=$PREFIX \ --enable-shared \ --disable-static \ --disable-doc \ --disable-ffserver \ --enable-cross-compile \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG}PREFIX=$(pwd)/androidADDI_CFLAGS="-marm"build_ffmpeg
4
使用命令修改build文件的屬性
chmod a+x build.sh
5
接下來就是執行build.sh文件,"."表示當前目錄
./build.sh
執行成功後,會生成config.h配置文件
6
開始編譯,
make
make install
執行成功會在Android目錄下生成一系列目錄,bin、include、lib、share,生成的庫就在lib目錄下
4. 如何在Android上集成ffmpeg
下面把具體編譯步驟描述如下,假定NDK安裝在~/android-ndk-r7:
1. 首先從FFmpeg官網下載最新的release版本源碼ffmpeg-0.11.tar.gz解壓縮到Android源碼樹的ffmpeg/下。
2 准備一個編譯腳本build_android.sh並放在ffmpeg/下面,這個腳本也是Rockplayer提供的,需做一些修改,其內容附在後面。我目前用的也會附在後面。
3 在ffmpeg目錄下運行./build_android.sh開始編譯FFmpeg,編譯好的libffmpeg.so會放在文件夾android裡面,一共有3個版本分別對應3種ARM體系結構,包括armv7-a、armv7-a-vfp、armv6_vfp,根據所運行的硬體平台選取其中一個版本。為了編譯使用FFmpeg的程序時可以方便地找到libffmpeg.so,可將它復制到$OUT/system/lib/和$OUT/obj/lib/,當然這一步也可以加在build_android.sh中做。
4. 接下來就是編譯可執行文件ffmpeg了,這個工具可以在命令行下完成FFmpeg提供的幾乎所有功能包括編碼、解碼、轉碼等,也是用來調試和驗證很有用的工具。其實上述編譯完後在$ANDROID_BUILD_TOP/external/ffmpeg/下也會生成ffmpeg,但是在設備上無法運行。為了編出能在設備上運行的ffmpeg,可以寫一個簡單的Android.mk,
5. 如何用Android NDK編譯FFmpeg
Android NDK編譯FFmpeg
配置編譯環境
在 VirtualBox 中創建一個 Ubuntu 虛擬機
在 Ubuntu 虛擬機中使用 sudo passwd root 命令啟動 root 賬戶
用 root 賬戶登錄進入 Ubuntu
將 android-ndk-r4b-linux-x86.zip 中的內容解壓縮到 /root 目錄下
將 android-sdk_r07-linux_x86.tgz 中的內容解壓縮到 /root 目錄下
將 ffmpeg-0.6.1.tar.bz2 中的內容解壓縮到 /root/ffmpeg/jni 目錄下
三、准備編譯 FFmpeg
編寫 mk 文件
在 /root/ffmpeg/jni 目錄中創建一個 Android.mk 文件,內容如下
?1include $(all-subdir-makefiles)
在 /root/ffmpeg/jni/ffmpeg-0.6.1 目錄中創建一個 Android.mk 文件,內容如下
6LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_WHOLE_STATIC_LIBRARIES := libavformat libavcodec libavutil
libpostproc libswscale
LOCAL_MODULE := ffmpeg
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))
在 /root/ffmpeg/jni/ffmpeg-0.6.1 目錄中創建一個 av.mk 文件,內容如下
# LOCAL_PATH is one of libavutil, libavcodec, libavformat, or
libswscale
#include $(LOCAL_PATH)/../config-$(TARGET_ARCH).mak
include $(LOCAL_PATH)/../config.mak
OBJS :=
OBJS-yes :=
MMX-OBJS-yes :=
include $(LOCAL_PATH)/Makefile
# collect objects
OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes)
OBJS += $(OBJS-yes)
FFNAME := lib$(NAME)
FFLIBS := $(foreach,NAME,$(FFLIBS),lib$(NAME))
FFCFLAGS = -DHAVE_AV_CONFIG_H -Wno-sign-compare -Wno-switch
-Wno-pointer-sign
FFCFLAGS += -DTARGET_CONFIG=/"config-$(TARGET_ARCH).h/"
ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)
ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES)))
ifneq ($(ALL_S_FILES),)
ALL_S_OBJS := $(patsubst %.S,%.o,$(ALL_S_FILES))
C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS))
S_OBJS := $(filter $(ALL_S_OBJS),$(OBJS))
else
C_OBJS := $(OBJS)
S_OBJS :=
endif
C_FILES := $(patsubst %.o,%.c,$(C_OBJS))
S_FILES := $(patsubst %.o,%.S,$(S_OBJS))
FFFILES := $(sort $(S_FILES)) $(sort $(C_FILES))
在 /root/ffmpeg/jni/ffmpeg-0.6.1/libavcodec 目錄中創建一個 Android.mk 文件,內容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := /
$(LOCAL_PATH) /
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
在 /root/ffmpeg/jni/ffmpeg-0.6.1/libavformat 目錄中創建一個 Android.mk 文件,內容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := /
$(LOCAL_PATH) /
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_CFLAGS += -include "string.h" -Dipv6mr_interface=ipv6mr_ifindex
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
在 libavfilter、libavutil、libpostproc 和 libswscale 目錄中各創建一個 Android.mk
文件,內容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := /
$(LOCAL_PATH) /
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)
修改 libm.h 文件和 Makefile 文件
編輯 /root/ffmpeg/jni/ffmpeg-0.6.1/libavutil 目錄中的 libm.h 文件,刪除以下 static
方法
#if !HAVE_LRINT
static av_always_inline av_const long int lrint(double x)
{
return rint(x);
}
#endif /* HAVE_LRINT */
#if !HAVE_LRINTF
static av_always_inline av_const long int lrintf(float x)
{
return (int)(rint(x));
}
#endif /* HAVE_LRINTF */
#if !HAVE_ROUND
static av_always_inline av_const double round(double x)
{
return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
}
#endif /* HAVE_ROUND */
#if !HAVE_ROUNDF
static av_always_inline av_const float roundf(float x)
{
return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
}
#endif /* HAVE_ROUNDF */
#if !HAVE_TRUNCF
static av_always_inline av_const float truncf(float x)
{
return (x > 0) ? floor(x) : ceil(x);
}
#endif /* HAVE_TRUNCF */
編輯 libavcodec、libavfilter、libavformat、libavutil、libpostproc 和 libswscale
目錄中的 Makefile 文件,刪除
?1include $(SUBDIR)../subdir.mak
和
?1include $(SUBDIR)../config.mak
生成 config.h 文件
在 /root/ffmpeg/jni/ffmpeg-0.6.1 目錄中創建一個 config.sh 文件,使用 Android NDK r4b
編譯時內容如下
#!/bin/bash
PREBUILT=/root/android-ndk-r4b/build/prebuilt/linux-x86/arm-eabi-4.4.0
PLATFORM=/root/android-ndk-r4b/build/platforms/android-8/arch-arm
./configure --target-os=linux /
--arch=arm /
--enable-version3 /
--enable-gpl /
--enable-nonfree /
--disable-stripping /
--disable-ffmpeg /
--disable-ffplay /
--disable-ffserver /
--disable-ffprobe /
--disable-encoders /
--disable-muxers /
--disable-devices /
--disable-protocols /
--enable-protocol=file /
--enable-avfilter /
--disable-network /
--disable-mpegaudio-hp /
--disable-avdevice /
--enable-cross-compile /
--cc=$PREBUILT/bin/arm-eabi-gcc /
--cross-prefix=$PREBUILT/bin/arm-eabi- /
--nm=$PREBUILT/bin/arm-eabi-nm /
--extra-cflags="-fPIC -DANDROID" /
--disable-asm /
--enable-neon /
--enable-armv5te /
--extra-ldflags="-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x
-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib
$PREBUILT/lib/gcc/arm-eabi/4.4.0/crtbegin.o
$PREBUILT/lib/gcc/arm-eabi/4.4.0/crtend.o -lc -lm -ldl"
使用 Android NDK r5 編譯時內容如下
#!/bin/bash
PREBUILT=/root/android-ndk-r5/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86
PLATFORM=/root/android-ndk-r5/platforms/android-8/arch-arm
./configure --target-os=linux /
--arch=arm /
--enable-version3 /
--enable-gpl /
--enable-nonfree /
--disable-stripping /
--disable-ffmpeg /
--disable-ffplay /
--disable-ffserver /
--disable-ffprobe /
--disable-encoders /
--disable-muxers /
--disable-devices /
--disable-protocols /
--enable-protocol=file /
--enable-avfilter /
--disable-network /
--disable-mpegaudio-hp /
--disable-avdevice /
--enable-cross-compile /
--cc=$PREBUILT/bin/arm-eabi-gcc /
--cross-prefix=$PREBUILT/bin/arm-eabi- /
--nm=$PREBUILT/bin/arm-eabi-nm /
--extra-cflags="-fPIC -DANDROID" /
--disable-asm /
--enable-neon /
--enable-armv5te /
--extra-ldflags="-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x
-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib
$PREBUILT/lib/gcc/arm-eabi/4.4.0/crtbegin.o
$PREBUILT/lib/gcc/arm-eabi/4.4.0/crtend.o -lc -lm -ldl"
打開終端,進入 /root/ffmpeg/jni/ffmpeg-0.6.1 目錄,運行下面的命令
6. 請問如何使用ffmpeg將攝像頭捕獲的視頻進行壓縮
無解
7. Android端webapp開發視頻壓縮有什麼解決方案嗎
圖片/視頻的選擇,編輯和壓縮是業務中的常見需求,Phoenix完整的實現了這些功能,並提供了優雅的調用方式。Phoenix的核心功能基於Kotlin實現,外層介面基於Java實現,方便Kotlin與Java雙方的調用。
特點
8. android 視頻壓縮上傳,怎麼弄
將ffmpeg交叉編譯後形成so庫後,然後jni 用ffmpeg中的方法進行視頻壓縮。
但在用ffmpeg進行壓縮的時候,一般都會損失視頻質量的
9. ffmpeg 如何獲取視頻尺寸想把視頻尺寸縮小為原尺寸的一半
重新編碼啊。-vcodec libx264 -r 15 -s 600x450 -aspect 4:3 -vb 320k -acodec libmp3lame -ar 44100 -ab 32k -ac 2
你不想改變就是 。-vcodec -acodec
10. 哪位高手做過ffmpeg在android下的運用.小弟我只想調用解碼H264的幀
Anyview是手機上的電子閱讀器。雖然市面上已有現成的、比較成熟的電子書軟體,然而由於其需要對每一本書本進行製作,因此就產生了Anyview。Anyview現在跨越的平台有 Java、黑莓平台、塞班S60平台、以及Android平台!Anyview希望成為最好的手機閱讀器,並且希望向使用該軟體的用戶提供良好的閱讀字體、順手的操作、強大的閱讀功能,因此,Anyview從一開始就將目標鎖定在文本閱讀上。
支持的種類:TXT:支持UNICODE、GB2312、UTF-8格式,linux平台上生成的UTF-8格式的TXT請使用「打開為UTF-8」HTML:暫時沒有對HTML有良好的支持,僅當作TXT來閱讀,將來會完善的PDB:目前只支持TEXt/REAd類型的PDB文件UMD:支持PNG:支持JPEG:超過100K的JPEG會使用軟解碼方式,以便用戶在手機上能瀏覽更大的圖片,最大支持500KGIF:支持,動畫和非動畫的GIFZIP*:對ZIP最大限度的支持,無需要解壓縮,可以直接在ZIP中閱讀上述格式的文件,並且不需要任何臨時空間Anyview計劃支持更多的格式,但並不打算對部分廠商私有格式進行支持在手機上處理zip文件,僅從合理化的需要考慮,刪除了部分ZIP特性,請注意:1.不支持帶有文件夾的ZIP(ZIP本身就被當作文件夾處理)2.不支持帶有密碼的ZIP3.不支持在ZIP中打開ZIP4.在解壓縮一個ZIP文件中的全部文件時,如果可用空間少於解壓需要空間的120%,會拒絕該操作