A reproduzir um vídeo em VideoView no Android
Também criei um cartão SD para o meu emulador. Preciso de colocar o meu cartão SD numa pasta em particular no meu SDK? Comentar.não é possível reproduzir vídeo: Desculpe, este vídeo não pode ser reproduzido.
Aqui está o layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_height="fill_parent"
android:paddingLeft="2px"
android:paddingRight="2px"
xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingTop="2px"
android:paddingBottom="2px"
android:layout_width="fill_parent"
android:orientation="vertical">
<VideoView
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:id="@+id/VideoView" />
</LinearLayout>
Aqui está o código:
package com.examples.videoviewdemo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;
public class VideoViewDemo extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
VideoView videoView = (VideoView)findViewById(R.id.VideoView);
//MediaController mediaController = new MediaController(this);
// mediaController.setAnchorView(videoView);
//videoView.setMediaController(mediaController);
videoView.setVideoPath("/sdcard/blonde_secretary.3gp");
videoView.start();
}
}
À espera da resposta...
13 answers
Como outros indicaram, por favor, testem isto num dispositivo. A reprodução de vídeo no emulador requer muita energia.
Exemplo De Projecto
Finalmente tenho um projecto de demonstração para trabalhar, por isso vou partilhá-lo aqui.Configure o layout
A configuração é assim, onde a área cinzenta clara é a VideoView
.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
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="com.example.videotest.MainActivity">
<VideoView
android:id="@+id/videoview"
android:layout_width="300dp"
android:layout_height="200dp"/>
<Button
android:text="Play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/videoview"
android:onClick="onButtonClick"
android:id="@+id/button"/>
</RelativeLayout>
Preparem o vídeo clip.
De acordo com a documentação , o Android deverá suportar a reprodução mp4 H. 264 (descodificação) para todos os níveis da API. No entanto, ser um monte de fatores que afetam se um vídeo real vai reproduzir ou não. A resposta mais profunda que consegui encontrar que dizia Como codificar os vídeos é aqui. Ele usa a poderosa ferramenta da linha de comandos ffmpeg
para fazer a conversão para algo que deve ser jogável em todos (Esperemos?) Android devices. Leia a resposta a que liguei para mais explicações. Eu usei uma versão ligeiramente modificada porque eu estava recebendo erros com a versão original.
ffmpeg -y -i input_file.avi -s 432x320 -b:v 384k -vcodec libx264 -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8 -subq 6 -trellis 0 -refs 5 -bf 0 -coder 0 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -c:a aac -ac 1 -ar 16000 -r 13 -ab 32000 -aspect 3:2 -strict -2 output_file.mp4
Eu definitivamente leria um muito mais em cada um desses parâmetros para ver o que precisa ajustar tanto quanto a qualidade de vídeo e áudio ir.
A seguir, mude o nome output_file.mp4
para test.mp4
e coloque-o na pasta do seu projecto Android /res/raw
. Crie a pasta se ela já não existir.
Código
Não há muito no código. O vídeo toca quando o botão" Play " é clicado. Graças a esta resposta para pedir ajuda.MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onButtonClick(View v) {
VideoView videoview = (VideoView) findViewById(R.id.videoview);
Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.test);
videoview.setVideoURI(uri);
videoview.start();
}
}
Terminado
É tudo. Você deve ser capaz de jogar o vídeo clip no simulador ou um dispositivo real agora.Fazer {[1] } uma variável membro da sua classe de actividade em vez de a manter como local para a função onCreate
:
VideoView videoView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
videoView = (VideoView)findViewById(R.id.VideoView);
videoView.setVideoPath("/sdcard/blonde_secretary.3gp");
videoView.start();
}
Deve funcionar ao telefone. O emulador está a ter dificuldade em reproduzir vídeos, também me aconteceu a mim.
Tente aumentar o nível de API necessário para o mais recente, pode ajudar!
Carregue com o botão direito no projecto aberto, escolha as propriedades > Android > verifique a versão mais recente do lado direito...
Igor
Pode aceder ao seu cartão SD através do DDMS
Para confirmar que o vídeo está no formato correcto (resolução, bitrate, codec, etc.) verificar com a documentação oficial - extracto abaixo:
Definição Padrão (Qualidade Baixa)
Video codec-H. 264
Resolução Vídeo-176 x 144 px
Taxa de imagens de vídeo-12 fps
Taxa de dados de vídeo-56 Kbps
Codec de áudio-AAC-LC
Canais de áudio - (mono)
Taxa de dados de áudio-24 Kbps
Definição Padrão (alta qualidade)
Codificador de vídeo - H. 264
Resolução Vídeo-480 x 360 px
Taxa de imagens de vídeo-30 fps
Taxa de dados de vídeo-500 Kbps
Codec de áudio-AAC-LC
Canais de áudio-2 (estéreo)
Taxa de dados de áudio-128 Kbps
Alta definição 720p (N / A em todos os dispositivos)
Video codec-H. 264
Resolução vídeo-1280 x 720 px
Taxa de imagens de vídeo-30 fps
Taxa de dados de vídeo-2 Mbps
Codec de áudio-AAC-LC
Canais de áudio-2 (estéreo)
Taxa de dados de áudio-192 Kbps
VideoView videoView =(VideoView) findViewById(R.id.videoViewId);
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+"/yourvideo");
videoView.setVideoURI(uri);
videoView.start();
Em vez de usar setVideoPath use setVideoUri. você pode obter o caminho do seu vídeo armazenado no armazenamento externo Usando (Ambiente.getExternalStorageDirectory().getAbsolutePath ()+" / yourvideo") e analisá-lo em Uri. Se o seu vídeo for gravado em sdcard / MyVideo / video. mp4 substitua "/ yourvideo "em código por" / MyVideo/video. mp4"
Isto funciona bem para mim. `public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.main);
String videourl = "http://something.com/blah.mp4";
Uri uri = Uri.parse(videourl);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setDataAndType(uri, "video/mp4");
startActivity(intent);
}
OuClique aqui para ver o Tutorial de Streaming de vídeo do Android .
//just copy this code to your main activity.
if ( ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ){
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE)){
}else {
ActivityCompat.requestPermissions(MainActivity.this,new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},1);
}
}else {
}