如何从资产文件夹或原始文件夹在Android中播放video?
我想在Android模拟器中播放video我有我的资产文件夹中的video以及原始文件夹但做了一些研究后,仍然不能在我的模拟器中播放video我工作在Android 2.1我的video格式是MP4,所以我不要认为这应该是一个问题任何人都可以给我一个示例代码,以便我可以了解更多一点?
问题是,我需要显示video的VideoView将只有一个URI或文件path指向video。
如果我将video保存在raw或assets文件夹中,我只能得到一个inputstream或一个文件描述符,而且似乎没有什么可以用来初始化VideoView。
更新
我仔细研究了MediaPlayer示例,并尝试使用FileDescriptor将MediaPlayer启动到资源文件,如下面的代码所示:
SurfaceView videoView = (SurfaceView) findViewById(gettingStarted) SurfaceHolder holder = videoView.getHolder(); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); final MediaPlayer player = new MediaPlayer(); player.setDisplay(holder); player.setDataSource(getAssets().openFd(fileName).getFileDescriptor()); player.prepareAsync(); player.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } });
现在我得到一个例外:
java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
似乎没有其他方式,然后复制文件到SD卡上启动,这似乎是浪费时间和内存。
##从Android 1.6开始完美工作##
getWindow().setFormat(PixelFormat.TRANSLUCENT); VideoView videoHolder = new VideoView(this); //if you want the controls to appear videoHolder.setMediaController(new MediaController(this)); Uri video = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.your_raw_file); //do not add any extension //if your file is named sherif.mp4 and placed in /raw //use R.raw.sherif videoHolder.setVideoURI(video); setContentView(videoHolder); videoHolder.start();
##检查完整的教程##
尝试:
AssetFileDescriptor afd = getAssets().openFd(fileName); player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());
String UrlPath="android.resource://"+getPackageName()+"/"+R.raw.ur file name; videocontainer.setVideoURI(Uri.parse(UrlPath)); videocontainer.start();
videoviewtypes的videocontainer。
PlayVideoActivity.java:
public class PlayVideoActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_play_video); VideoView videoView = (VideoView) findViewById(R.id.video_view); MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoView); videoView.setMediaController(mediaController); videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.documentariesandyou)); videoView.start(); } }
activity_play_video.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" > <VideoView android:id="@+id/video_view" android:layout_width="match_parent" android:layout_height="match_parent" > </VideoView> </LinearLayout>
如果我没记错的话,从资产文件夹中加载数据库的时候遇到同样的问题。 看来你的资产文件夹中的东西可以有2个统计:压缩或不压缩。
如果是压缩的,那么你可以让1M的内存解压缩,否则你会得到这种exception。 有几个错误报告 ,因为文档不清楚。 所以,如果你仍然想使用你的格式,你必须使用一个未压缩的版本,或给你的文件扩展名为.mp3或.png。 我知道这有点疯狂,但我加载一个.mp3扩展名的数据库,它工作得很好。 这个其他的解决scheme是打包你的应用程序一个特殊的选项,告诉它不要压缩某些扩展名。 但是,您需要手动构build应用程序并添加“zip -0”选项。
未压缩的assest的优点是,在发布应用程序之前,zip-align的阶段将正确alignment数据,以便在加载到内存时可以直接映射。
所以,解决scheme:
- 将文件的扩展名更改为.mp3或.png,看看它是否工作
- 手动构build您的应用程序并使用zip-0选项
您是否尝试在SDCard上手动录制video并尝试在SDCard上播放video存储?
如果工作正常,您可以在这里find从Raw复制到SD卡的方法:
android-copy-rawfile-to-sdcard-video-mp4 。
我find了 :
Uri raw_uri = Uri.parse(<package_name>/+R.raw.<video_file_name>);
Android人员发现资源,但现在不能播放。 我的文件是.m4v
我认为你需要看这个 – 它应该有你想要的一切。
编辑:如果你不想看链接 – 这几乎总结了你想要的。
MediaPlayer mp = MediaPlayer.create(context,R.raw.sound_file_1); mp.start();
但我仍然build议阅读链接上的信息。
VideoView myVideo = (VideoView) rootView.findViewById(R.id.definition_video_view); //Set video name (no extension) String myVideoName = "my_video"; //Set app package String myAppPackage = "com.myapp"; //Get video URI from raw directory Uri myVideoUri = Uri.parse("android.resource://"+myAppPackage+"/raw/"+myVideoName); //Set the video URI myVideo.setVideoURI(myVideoUri); //Play the video myVideo.start();
这听起来也许就像你有同样的问题,我做。 是否可以使用3GPP而不是使用MP4? 我想我用的是HandBrake或者其他什么的video转换器…你只需要确保你有正确的编码器,比如H.264x或者什么的。 抱歉有点模糊,已经有一段时间了。 另外,如果可能的话,不要担心android 2.1的问题了,而且,一些事情在EMULATOR里是行不通的。 所以如果它在很多设备上都能正常工作,那么就假设它是有效的(特别是对于不同的制造商而言)
在这里,你可以阅读我的问题,我是如何解决这个问题的(经过很长时间,没有人有答案)。 我在这里解释了更多的细节: 安卓媒体播放器不工作
在fileName
你必须把文件的相对path(没有/asset
),例如:
player.setDataSource( getAssets().openFd(**"media/video.mp4"**).getFileDescriptor() );
a-使用MediaPlayer
API和示例代码。
b-将媒体文件放在raw
文件夹中
c-获取文件描述符
d- mediaplayer.setDataSource(fd,offset,length);
– 它是一个三个参数的构造函数
e-然后当onPreared
, mediaplayer.start();
MainCode
Uri raw_uri=Uri.parse("android.resource://<package_name>/+R.raw.<video_file_name>); myVideoView=(VideoView)findViewbyID(R.idV.Video_view); myVideoView.setVideoURI(raw_uri); myVideoView.setMediaController(new MediaController(this)); myVideoView.start(); myVideoView.requestFocus();
XML
<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <VideoView android:id="+@/Video_View" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>