Потоковое видео MP4 с позиции поиска в ASP.NET - PullRequest
1 голос
/ 23 марта 2012

Возникла проблема при потоковой передаче видео в формате mp4 с позиции поиска.Его потоковая передача с самого начала корректна.

Первая проблема заключается в том, что mp4-видео идет через флеш-плеер jw player.Когда пользователь нажимает на панель времени, чтобы начать потоковую передачу видео mp4 из любой другой части видео, jw player отправит стартовый параметр вместе с информацией о времени, например,

http://[url]/stream/mp4.ashx?file=Madagascar3-trailer-48861c.mp4&start=53.71

Так что jwplayer отправит интервал времени для поиска потоковой передачи mp4.

Я использую следующий код для преобразования приблизительного интервала времени в байты, так как поиск будет начинаться через байты.

 double total_duration = Convert.ToDouble(context.Request.Params["d"]);
 double startduration = Convert.ToDouble(context.Request.Params["start"]);
 double length_sec = (double)size / total_duration; // total length per second
 start = (long)(length_sec * startduration);

Вот полный пример кода, который я использую для начала потоковой передачи с позиции поиска, например, 53,71

private void ChunkDownload(string fullpath, HttpContext context)
{
    long size, start, end, length, fp = 0;
    using (StreamReader reader = new StreamReader(fullpath))
    {
        size = reader.BaseStream.Length;
        start = 0;
        end = size - 1;
        length = size;

        double total_duration = Convert.ToDouble(context.Request.Params["d"]);
        double startduration = Convert.ToDouble(context.Request.Params["start"]);
        double length_sec = (double)size / total_duration; // total length per second
        start = (long)(length_sec * startduration);

        context.Response.AddHeader("Accept-Ranges", "0-" + size);
        long anotherStart = start;
        long anotherEnd = end;

        // End bytes can not be larger than $end.
        anotherEnd = (anotherEnd > end) ? end : anotherEnd;
        // Validate the requested range and return an error if it's not correct.
        if (anotherStart > anotherEnd || anotherStart > size - 1 || anotherEnd >= size)
        {

            context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size);
            throw new HttpException(416, "Requested Range Not Satisfiable");
        }
        start = anotherStart;
        end = anotherEnd;

        length = end - start + 1; // Calculate new content length
        fp = reader.BaseStream.Seek(start, SeekOrigin.Begin);
        context.Response.StatusCode = 206;

    }
    // Notify the client the byte range we'll be outputting
    context.Response.AddHeader("Content-Range", "bytes " + start + "-" + end + "/" + size);
    context.Response.AddHeader("Content-Length", length.ToString());

    context.Response.WriteFile(fullpath, fp, length);
    context.Response.End();

}

Но он не смог распознать действительный поток mp4 ни по игроку, ни по прямой ссылке на поток.

Может кто-нибудь помочь мне решить эту проблему.

Ответы [ 6 ]

2 голосов
/ 12 июля 2012

После поиска в Google не найдено соответствующих API.

Вы можете проверить обходной путь, если проблема не может быть исправлена.

Если возможно, предоставьте больше информации для дальнейшего изучения.

2 голосов
/ 10 июля 2012

Согласен, вы не можете просто так искать файл mp4 / m3u8.

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

1 голос
/ 17 апреля 2012

Нет допустимого определения типа контента.Попробуйте установить ContentType как video / mp4.

UPDATE

Хотя тип содержимого определен и в соответствии с вашим кодом код состояния http - 206, я предлагаю вам проверить эту страницу: 206 Частичное содержимое

0 голосов
/ 25 ноября 2013

Я не буду комментировать материал ответа в этом посте, но одна проблема, которую вы определенно имеете, это разбор MP4. В отличие от MP3, вы не можете легко преобразовать временное смещение в байтовый диапазон, как этот. Вам нужно будет проанализировать элемент mp4 moov и найти нужный фрагмент в соответствующих дорожках, основываясь на смещении времени, которое вас интересует. Это выглядит так: moov-> trak-> mdia-> minf-> stbl-> stts Поле stts предоставит вам образец необходимого времени.

0 голосов
/ 23 апреля 2012

Не думаю, что вы можете просто так искать файл mp4.Даже если у вас есть заголовки, вам нужно искать I-кадр, чтобы видео могло воспроизводиться.Скорее всего, вы используете неправильные API для этого.

0 голосов
/ 18 апреля 2012

Мухаммед,

Я заметил, что вы делаете много вычислений и манипулируете заголовками контента.Возможно, когда вы выполняете всю математику для тех, это приводит к тому, что заголовок становится недопустимым из-за лишних десятичных знаков (что делает его недействительным) или из-за других проблем с этими настройками.следующее:

  1. Запустите пример видео с потоковой передачей с сайта, используя тот же проигрыватель и т. д., а затем используйте инструмент для просмотра заголовков во время его успешной работы.Просто чтобы иметь базовый набор заголовков и допустимых форматов значений для сравнения.

  2. Запустите ваше приложение и отследите заголовки после того, как вы их установили, возможно, так: howдля вывода заголовков ответов в ASP.Net Еще лучше установить плагин FireFox 'Live HTTP Headers' или что-то в этом духе.

Сравните рабочий набор заголовков с вашим,Вы видите что-то странное в значениях, которые вы устанавливаете?Возможно ли диапазон содержимого / длина / и т.д.как-то смещено или недействительно?Просто посмотрите на последовательность, небольшая ошибка может легко сломать весь запрос.

Возможно, я что-то здесь упускаю, но я надеюсь, что это вызывает некоторые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...