Android Не удается воспроизвести видео в формате mp4 с помощью 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();  
        }
    });

Вот результат отладки. У вас есть URL-адрес видео в отладке.

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 Гц, стерео (L R) FPS: 25 Скорость передачи данных: 2,23 Мбит / с Текущий размер: 624 x 351 пикс.


person Burak Dede    schedule 23.08.2012    source источник


Ответы (3)


В основном это из-за кодировки. Я вижу, что разрешение вашего видеофайла - 624x351, что нестандартно, так что это может быть одной из причин. Также проверьте максимальную скорость передачи данных и частоту кадров в секунду, так как все мобильные устройства имеют некоторое ограничение, как и для большинства мобильных телефонов Android - 30 кадров в секунду. Вам следует обратиться к этому документу, чтобы сделать ваш файл совместимым со всеми телефонами Android. Android Media Formats

Кроме того, если вы можете поделиться командой кодирования (если вы ее выполняете), будет легко отследить проблему.

person Avichal Badaya    schedule 23.08.2012
comment
нет, это не я предоставляю видео. Но я могу быстро проверить детали кодирования видео и обновить вопрос. - person Burak Dede; 24.08.2012
comment
Да, я проверил ваши данные о кодировании: - Размер: - 624X351, Кодеки: AAC, H.264, Аудиоканал -2 и скорость передачи данных 2233. Я могу помочь вам в тестировании стандартных видеороликов. Эту страницу мы сделали, чтобы выбрать стандарт для нашего собственного приложения. Сообщите мне, если это поможет. Где HLS - это Http live streaming (формат плейлиста m3u8), а остальные Mp4. ec2-23-20-128-151.compute- 1.amazonaws.com/test.html. Мы сделали это для iPhone, но вы можете сделать некоторые выводы и для Android. - person Avichal Badaya; 24.08.2012
comment
да, я разместил детали кодировки так же, как и вы. Позвольте мне проверить тот, который вы предоставили. - person Burak Dede; 24.08.2012
comment
отлично, дайте мне знать, какой из них работает для вас, чтобы я мог предоставить вам сведения о кодировке. - person Avichal Badaya; 24.08.2012
comment
хорошо, я только что протестировал вашу версию mp4, но она дает ту же ошибку. Вот URL, который я использовал с вашей страницы. ec2-23-20-128- 151.compute-1.amazonaws.com/tests/videos/ - person Burak Dede; 24.08.2012
comment
Вот ошибка отладки 08-24 00: 37: 06.399: E / MediaPlayer (18527): error (1, -2147483648) 08-24 00: 37: 06.439: I / VideoView (18527): start () 08-24 00: 37: 06.439: E / MediaPlayer (18527): запуск вызывается в состоянии 0 08-24 00: 37: 06.439: E / MediaPlayer (18527): error (-38, 0) 08-24 00: 37: 06.459: E / MediaPlayer (18527): Ошибка (1, -2147483648) 08-24 00: 37: 06.459: D / VideoView (18527): Ошибка: 1, -2147483648 08-24 00: 37: 06.459: E / MediaPlayer (18527 ): Ошибка (-38,0) 08-24 00: 37: 06.459: D / VideoView (18527): Ошибка: -38,0 - person Burak Dede; 24.08.2012
comment
вы пробовали работать с test.html. Насколько я понимаю, последнее видео в test.html должно работать, а также, если скорость передачи данных превышает 2 Мбит / с (как в вашем первоначальном случае), это может быть проблематично. Попробуйте использовать видео низкого качества и теги видео html5. Подскажите, на каких версиях Android вы тестируете? - person Avichal Badaya; 24.08.2012
comment
Я жестко запрограммировал каждый URL-адрес видео, который вы только что дали мне в моем приложении. Но ни один из них не работал на моем Galaxy Ace 2.3.3. Я также должен протестировать их на моем galaxy s3, чтобы узнать, является ли это конкретным устройством. Но все получили, не могут воспроизводить видео. Я не подозреваю, что из моего кода, потому что это кажется очевидным способом сделать это. - person Burak Dede; 24.08.2012
comment
Не кодируйте это жестко. Запустите мой URL-адрес test.html в своем браузере. а затем протестируйте. - person Avichal Badaya; 24.08.2012
comment
Хорошо, только mpeg, похоже, воспроизводятся в браузере (включая последний). Также я сделал тестовые видео на моем galaxt s3, и каждый из них может воспроизводиться плавно. - person Burak Dede; 24.08.2012
comment
отлично, видео HLS специально предназначены для iphone / ipad, поэтому они не будут работать в других браузерах, кроме safari. В любом случае, вы сможете решить проблемы, просто выбрав правильный формат кодирования. удачи. - person Avichal Badaya; 24.08.2012

Я предлагаю вам следующий код, в котором я успешно запускаю свое приложение

Код выглядит следующим образом:

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>
person Hardik Vora    schedule 19.11.2012

Размер вашего видео, которое транслируется, отличается от размера вашего видеопросмотра.

person user3680160    schedule 27.05.2014