我正在尝试使用仅包含videoview的全屏活动来播放mp4视频。但即使它很容易在我的galaxt s3上播放,它也不会播放大多数设备。我怀疑它是关于视频的编码(顺便说一句,你必须成为编解码器大师才知道哪个视频播放不是)。
这是我正在使用的代码。
//make screen full with video
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
setContentView(R.layout.full_screen_video);
//get extra video source string
Intent intent = getIntent();
if(intent != null){
videoSrc = intent.getStringExtra(TefalTvApp.RECIPE_VIDEO_SOURCE);
if (DEBUG) {
Log.d(TAG, "Recipe title : " + videoSrc);
}
}
video = (VideoView) findViewById(R.id.recipeVideo);
controller = new MediaController(FullScreenVideoActivity.this);
controller.setMediaPlayer(video);
video.setMediaController(controller);
video.setVideoPath(videoSrc);
video.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (DEBUG) {
Log.d(TAG, "Hello wworld");
}
}
});
video.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
video.requestFocus();
video.start();
}
});
这是调试结果。您在调试中有视频网址。
08-23 23:25:53.349: D/RecipeDetailActivity(18179): Video src : http://www.tefaltv.com/Upload/Video/acticook_kiymalifasulye.mp4
08-23 23:25:53.379: I/ApplicationPackageManager(18179): cscCountry is not German : TUR
08-23 23:25:53.389: D/FullScreenVideoActivity(18179): Recipe title : http://www.tefaltv.com/Upload/Video/acticook_kiymalifasulye.mp4
08-23 23:25:53.399: D/VideoView(18179): onMeasure()
08-23 23:25:53.399: I/VideoView(18179): Setting size: 480x295
08-23 23:25:53.439: I/MediaPlayer(18179): uri is:http://www.tefaltv.com/Upload/Video/acticook_kiymalifasulye.mp4
08-23 23:25:53.439: I/MediaPlayer(18179): path is null
08-23 23:25:53.439: D/MediaPlayer(18179): Couldn't open file on client side, trying server side
08-23 23:25:53.519: D/VideoView(18179): onMeasure()
08-23 23:25:53.519: I/VideoView(18179): Setting size: 480x295
08-23 23:25:57.689: I/VideoView(18179): start()
08-23 23:25:57.739: D/VideoView(18179): onMeasure()
08-23 23:25:57.739: I/VideoView(18179): Setting size: 480x270
08-23 23:25:57.759: E/MediaPlayer(18179): error (1, -2147483648)
08-23 23:25:57.769: I/VideoView(18179): start()
08-23 23:25:57.779: E/MediaPlayer(18179): start called in state 0
08-23 23:25:57.779: E/MediaPlayer(18179): error (-38, 0)
08-23 23:25:57.799: E/MediaPlayer(18179): Error (1,-2147483648)
08-23 23:25:57.799: D/VideoView(18179): Error: 1,-2147483648
08-23 23:25:57.799: E/MediaPlayer(18179): Error (-38,0)
08-23 23:25:57.799: D/VideoView(18179): Error: -38,0
更新: 视频编码细节: 格式:H.264,624 x 351 AAC,44100 Hz,立体声(L R) FPS:25 数据速率:2.23mbit / s 当前尺寸:624x351像素实际
答案 0 :(得分:1)
这主要是因为编码。我看到你的视频文件分辨率是624x351,这不是标准的,所以这可能是一个原因。同时检查最大比特率和fps,因为所有移动设备都有一些上限,就像大多数Android手机的30fps一样。您应该参考此文档以使您的文件与所有Android手机兼容。 Android Media Formats
此外,如果您可以共享编码命令(如果您正在执行编码命令),则很容易跟踪问题。
答案 1 :(得分:-1)
我建议您使用以下代码,其中我正在成功运行我的应用程序
守则如下:
XML文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f0f0f0" >
<Button
android:id="@+id/btnVideoGallery"
android:layout_width="75dp"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="15dp"
android:text="@string/gallery" />
<Button
android:id="@+id/btnCancel"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_below="@+id/btnVideoGallery"
android:layout_centerHorizontal="true"
android:layout_marginTop="22dp"
android:text="@string/cancel" />
<TextView
android:id="@+id/lblDisplayImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btnCancel"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:text="@string/below_this_text_video_will_be_displayed"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#000000"
android:textSize="13dp" />
<VideoView
android:id="@+id/vvDisplayVideo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/lblDisplayImage"
android:layout_marginTop="15dp" />
</RelativeLayout>
Java文件:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.VideoView;
public class VideoActivity extends Activity {
private Button btnVideoGallery,btnCancel;
private VideoView vvDisplayVideo;
/** The Constant PICK_VIDEO. */
private static final int PICK_VIDEO=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_options);
btnVideoGallery=(Button)findViewById(R.id.btnVideoGallery);
vvDisplayVideo=(VideoView)findViewById(R.id.vvDisplayVideo);
btnCancel=(Button)findViewById(R.id.btnCancel);
vvDisplayVideo.setVisibility(View.GONE);
btnVideoGallery.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent video=new Intent();
video.setAction(Intent.ACTION_PICK);
video.setType("video/*");
startActivityForResult(video, PICK_VIDEO);
}
});
btnCancel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent goStartUp=new Intent(VideoActivity.this, StartUpActivity.class);
goStartUp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(goStartUp);
finish();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (resultCode==Activity.RESULT_OK && requestCode == PICK_VIDEO) {
vvDisplayVideo.setVisibility(View.VISIBLE);
vvDisplayVideo.setVideoURI(data.getData());
vvDisplayVideo.setFocusable(true);
MediaController mc=new MediaController(this);
vvDisplayVideo.setMediaController(mc);
Log.i("True", "Executed");
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
Intent goStartUp=new Intent(VideoActivity.this, StartUpActivity.class);
goStartUp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(goStartUp);
finish();
return super.onKeyDown(keyCode, event);
}
}
您还可以根据您的使用修改清单文件:
<manifest ...
<uses-sdk... />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_VIDEO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<application .....
</application>
</manifest>
答案 2 :(得分:-1)
正在流式传输的视频尺寸与视频尺寸不同