【问题标题】:Cant Play Video ( .mp4) uploaded from iPhone on Android无法播放从 iPhone 在 Android 上上传的视频 (.mp4)
【发布时间】:2015-03-22 00:29:19
【问题描述】:

实际上,我为 iphone 和 android 设备制作了一个应用程序.. 并且该视频功能可用,因此 iphone 设备上传的视频,视频 (mp4) 无法在 android 设备上播放,所以请任何人帮助我

pDialog = new ProgressDialog(this);

    // Set progressbar message
    pDialog.setMessage("Buffering...");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(false);
    // Show progressbar
    pDialog.show();

    try {
        // Start the MediaController
        MediaController mediacontroller = new MediaController(
                PlayVideoViewFromURLActivity.this);
        mediacontroller.setAnchorView(mVideoView);

        // Get the URL from String VideoURL

        Uri videoUri = Uri.parse(vidUrl); // vidUrl is url of video which on server 

        mVideoView.setMediaController(mediacontroller);
        mVideoView.setVideoURI(videoUri);

    } catch (Exception e) {

        e.printStackTrace();
    }

    mVideoView.requestFocus();
    mVideoView.setOnPreparedListener(new OnPreparedListener() {
        // Close the progress bar and play the video
        public void onPrepared(MediaPlayer mp) {
            pDialog.dismiss();
            mVideoView.start();
        }
    });
    mVideoView.setOnCompletionListener(new OnCompletionListener() {

        public void onCompletion(MediaPlayer mp) {
            if (pDialog.isShowing()) {
                pDialog.dismiss();
            }
            finish();
        }
    });

完整的 Logcat 错误:

08-13 09:45:10.062: D/MediaPlayer(1929): Couldn't open file on client side, trying server side

08-13 09:45:11.770: E/MediaPlayer(1929): error (1, -2147483648)

08-13 09:45:11.790: E/MediaPlayer(1929): Error (1,-2147483648)

08-13 09:45:11.790: D/VideoView(1929): Error: 1,-2147483648

【问题讨论】:

  • 使用的vidUrl是什么?
  • 我在我的 logcat 中得到了这个:08-13 09:45:10.054:W/EGL_emulation(1929):eglSurfaceAttrib 未实现 08-13 09:45:10.058:W/EGL_emulation(1929): eglSurfaceAttrib 未实现 08-13 09:45:10.062: D/MediaPlayer(1929): 无法在客户端打开文件,尝试服务器端 08-13 09:45:11.770: E/MediaPlayer(1929): 错误 (1 , -2147483648) 08-13 09:45:11.790: E/MediaPlayer(1929): 错误 (1,-2147483648) 08-13 09:45:11.790: D/VideoView(1929): 错误: 1,-2147483648 08 -13 09:45:11.802: W/EGL_emulation(1929): eglSurfaceAttrib 未实现
  • @Vaishali stackoverflow.com/questions/17865836/… 请参考此链接
  • @pratik 您正在复制粘贴她问题本身的代码。她在那里实施了同样的做法。

标签: android


【解决方案1】:

还有一种使用 MediaPlayer 类流式传输视频的替代方法,就像我们在创建音乐播放器时使用它一样。您可以使用表面视图将媒体(包括视频)流式传输到 MediaPlayer 对象。例如,您可以使用以下布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<SurfaceView
    android:id="@+id/surfView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

MainActivity.java

public class TestAct extends Activity implements SurfaceHolder.Callback, OnPreparedListener
{

private MediaPlayer mediaPlayer;
private SurfaceHolder vidHolder;
private SurfaceView vidSurface;
String vidAddress = "https://archive.org/download/ksnn_compilation_master_the_internet/ksnn_compilation_master_the_internet_512kb.mp4";

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    vidSurface = (SurfaceView) findViewById(R.id.surfView);
    vidHolder = vidSurface.getHolder();
    vidHolder.addCallback(this);
}

@Override
public void surfaceCreated(SurfaceHolder arg0)
{
    try
    {
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setDisplay(vidHolder);
        mediaPlayer.setDataSource(vidAddress);
        mediaPlayer.prepare();
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

@Override
public void onPrepared(MediaPlayer mp)
{
    mediaPlayer.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3)
{
}

}

希望这会有所帮助:)

【讨论】:

【解决方案2】:

问题:

视频与设备平台支持的编解码冲突问题。

解决方案:

我会坚持使用Vitamio 库在android 中播放视频。 它使用起来非常简单且可靠。

示例:

您可以将其添加到您的 xml 文件中,例如 VideoView

   <io.vov.vitamio.widget.VideoView
    android:id="@+id/surface_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

您可以轻松控制播放器,

public class VideoViewDemo extends Activity {

/**
 * TODO: Set the path variable to a streaming video URL or a local media file
 * path.
 */
private String path = "";
private VideoView mVideoView;
private EditText mEditText;

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    if (!LibsChecker.checkVitamioLibs(this))
        return;
    setContentView(R.layout.videoview);
    mEditText = (EditText) findViewById(R.id.url);
    mVideoView = (VideoView) findViewById(R.id.surface_view);
    if (path == "") {
        // Tell the user to provide a media file URL/path.
        Toast.makeText(VideoViewDemo.this, "Please edit VideoViewDemo Activity, and set path" + " variable to your media file URL/path", Toast.LENGTH_LONG).show();
        return;
    } else {
        /*
         * Alternatively,for streaming media you can use
         * mVideoView.setVideoURI(Uri.parse(URLstring));
         */
        mVideoView.setVideoPath(path);
        mVideoView.setMediaController(new MediaController(this));
        mVideoView.requestFocus();

        mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                // optional need Vitamio 4.0
                mediaPlayer.setPlaybackSpeed(1.0f);
            }
        });
    }

}

public void startPlay(View view) {
    String url = mEditText.getText().toString();
    path = url;
    if (!TextUtils.isEmpty(url)) {
        mVideoView.setVideoPath(url);
    }
}

public void openVideo(View View) {
  mVideoView.setVideoPath(path);
}

}

参考:

VideoViewDemo

希望对你有帮助。

【讨论】:

  • 感谢您的回复@Mehul Joisar .. 但仍然没有解决
  • Mehul joisar 我使用了与我的情况相同的代码,但存在问题 android videoview 方向已更改
  • @PrvN:您应该检查提供有关它的方向信息的视频的元数据。根据该方向信息,您应该旋转并播放视频。
  • @Mehul 感谢您的回复,我正在尝试从 url 播放视频,如何从 ulr 找到视频的元数据
  • @PrvN:如果您想支持旧版本,请查看FFmpegMediaMetadataRetriever,否则Android 已经从JellyBean 引入METADATA_KEY_VIDEO_ROTATION
【解决方案3】:

Can't Play video in android uploded from iphone

为什么 mp4 不能分 4 步播放:

  1. 使用“ffmpeg”将您的 vidView URL 下载到 PC

  2. $ffmpeg -i $downloadFileName

  3. 检查报告的编解码器的详细信息

  4. 将报告的编解码器与android media supports的编解码器进行比较

注意:#2 很可能会报告 #4 中未列出的编解码器

【讨论】:

  • 感谢您的回复,但视频下载不在项目的功能中..我必须缓冲并播放
【解决方案4】:

虽然视频是 .mp4,但视频在 iOS 上以原生 android 媒体播放器无法播放/解码的方式压缩。

我在为跨平台开发时遇到了这个确切的问题。一个简单的替代方法是使用 VLC for Android,它是开源的,基于 FFMPEG 构建并利用 SurfaceViews。

为此,请在您的 build.grade 文件中包含以下内容:

compile "de.mrmaffen:vlc-android-sdk:1.0.3"

例如,您可以为视频创建一个新活动,并在 onCreate 中执行以下操作:

mSurfaceView = (SurfaceView) findViewById(R.id.player_surface);
mSurfaceHolder = mSurfaceView.getHolder();

mSurfaceFrame = (FrameLayout) findViewById(R.id.player_surface_frame);
mMediaUrl = getIntent().getExtras().getString("videoUrl");

try {
    mLibVLC = LibVLC.getInstance();
    mLibVLC.setAout(mLibVLC.AOUT_AUDIOTRACK);
    mLibVLC.setVout(mLibVLC.VOUT_ANDROID_SURFACE);
    mLibVLC.setHardwareAcceleration(LibVLC.HW_ACCELERATION_FULL);
    mLibVLC.eventVideoPlayerActivityCreated(Boolean.TRUE);

    mLibVLC.init(getApplicationContext());
} catch (LibVlcException e){
    Log.e(TAG, e.toString());
}

mSurfaceHolder.addCallback(mSurfaceCallback);
mSurface = mSurfaceHolder.getSurface();

mLibVLC.attachSurface(mSurface, VideoVLCActivity.this);
mLibVLC.playMRL(mMediaUrl);

可以在此处找到大量信息以进行故障排除: VLC for Android VideoLAN Forums

有一个更详细的例子here,虽然它使用不同版本的libvlc.LibVLC并且包含不同的方法,但是它会让你很好地了解添加控件需要哪些步骤,设置合适的大小,纵横比、方向等。

【讨论】:

  • 您好,我正在尝试在我的 xamarin.android 项目中使用 vlc,但是视频在前 2 秒以像素化和灰色屏幕显示的屏幕您有什么想法我在这里提出新问题,@987654323 @
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
相关资源
最近更新 更多