Android MediaPlayer Потоковая передача из PHP Redirect не работает! - PullRequest
4 голосов
/ 26 августа 2010

Компания, в которой я работаю, разрабатывает приложение для Android, которое воспроизводит видеофайл с URL-адреса в Интернете.URL-адрес видео - это параметр для сценария PHP, который правильно его кодирует и перенаправляет на закодированное видео, как показано ниже:

header('Content-Type: video/'.$format);
header('Location:'.$output_video);

Где $output_video - это URL-адрес закодированного видео (он работает, если мы используемэтот URL в браузере), а $format - это формат видео.

Но когда я пытаюсь выполнить MediaPlayerDemo_Video из демонстрационных программ API с использованием режима потоковой передачи, я получаю сообщение об ошибке, подобное этому:

MediaPlayer Command PLAYER INIT completed with an error or info PVMFErrCorrupt
MediaPlayer error (1. -10)
MediaPlayer Error (1.-10)

Если мы жестко закодируем URL и форматируем в сценарии PHP, он также не работает, но с другой ошибкой:

MediaPlayer info/warning (1. 28)
MediaPlayer Info (1 .28)

У кого-нибудь есть идея?о том, как обойти это?

Заранее спасибо!

Ответы [ 5 ]

8 голосов
/ 04 января 2011

Я столкнулся с этой же проблемой. Оказывается, Android MediaPlayer не будет обрабатывать перенаправления, поэтому вам нужно найти, куда php-скрипт перенаправляет вас, и дать ему URL-адрес rtsp, как объяснил Jeorgesys.

Мне удалось решить, выполнив HttpGet и НЕ следуя каким-либо перенаправлениям, а затем вытащив URL-адрес rtsp из заголовка Http «Location». Если у вас несколько перенаправлений, у вас будет немного больше проблем, но, к счастью, в моем случае мне нужно беспокоиться только об одном перенаправлении.

public static String resolveRedirect(String url) throws ClientProtocolException, IOException {
    HttpParams httpParameters = new BasicHttpParams();
    HttpClientParams.setRedirecting(httpParameters, false);

    HttpClient httpClient = new DefaultHttpClient(httpParameters);      
    HttpGet httpget = new HttpGet(url);
    HttpContext context = new BasicHttpContext();

    HttpResponse response = httpClient.execute(httpget, context);

    // If we didn't get a '302 Found' we aren't being redirected.
    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_MOVED_TEMPORARILY)
        throw new IOException(response.getStatusLine().toString());

    Header loc[] = response.getHeaders("Location");
    return loc.length > 0 ? loc[0].getValue() : null;
}
2 голосов
/ 26 августа 2010

ответ - это какой файл вы пытаетесь передать в MediaPlayer, например, ваш URL должен быть примерно таким: ::

rtsp://v1.cache5.c.youtube.com/CjYLENy73wIaLQkUvSkxA_7UKxMYESARFEIJbXYtZ29vZ2xlSARSBXdhdGNoYIPXxZHky7m5Rgw=/0/0/0/video.3gp

(попробуйтес этим URL)

с использованием протокола rtsp и видеофайла .3gp с правильными кодеками , поддерживаемыми для android .

0 голосов
/ 04 мая 2017

Я адаптировал ответ Марка для использования современных компонентов Apache Http:

import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
// ...
    private static String resolveRedirect(String url) throws IOException {
        RequestConfig config = RequestConfig.custom().setRedirectsEnabled(false).build();

        CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(config).build();

        HttpGet httpget = new HttpGet(url);
        HttpContext context = new BasicHttpContext();

        HttpResponse response = httpClient.execute(httpget, context);

        // If we didn't get a '302 Found' we aren't being redirected.
        if (response.getStatusLine().getStatusCode() != HttpStatus.SC_MOVED_TEMPORARILY)
        {
            throw new IOException(response.getStatusLine().toString());
        }

        Header loc[] = response.getHeaders("Location");
        return loc.length > 0 ? loc[0].getValue() : null;
    }
// ...
0 голосов
/ 03 декабря 2013

php код:

$out = '#EXTM3U'.PHP_EOL;

$out .= '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=491520'.PHP_EOL;

$out .= $output_video; //Video's Url.

header('Content-Type:application/octet-stream');

echo $out;

exit;
0 голосов
/ 23 июля 2013

Вот простой пример

public class StreamVideo extends Activity
{
VideoView video;
@Override
protected void onCreate(Bundle savedInstanceState)  
{       
    super.onCreate(savedInstanceState);
    setContentView(R.layout.streamvideo);
    video = (VideoView)findViewById(R.id.videoView1);
    MediaController mc= new MediaController(this);
    mc.setAnchorView(video);
    mc.setMediaPlayer(video);
    video.setMediaController(mc);  
    try
    {       
        Uri uri = Uri.parse("rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov");
        video.setVideoURI(uri);
        video.start();
    }catch (Exception e)
    {
        Log.v("Video playing", e.getMessage());
    }
}   
}
...