2

iOS と Blackberry で実行されている PhoneGap/Cordova (あえて 2.3.0 にアップグレードするまでは 1.8.1) で作成されたアプリがあります。

ビデオの再生を開始しようとすると、アプリはビデオ プレーヤー (JQuery と JQuery Mobile を使用しています) でビデオの "ページ" div に切り替わり、ターゲット ビデオの URL を設定します。

プレーヤーは、以前にローカル ファイル システムにダウンロードされたファイルを再生することを目的としていますが、現在、Web からストリーミングされたものも再生しません。

ビデオ プレーヤーのすべてのイベントにリスナーを追加しました。単一の「loadstart」イベントが表示され、その後は何も表示されません。

初期化は次のとおりです。

HTML:

<video id="video_player" class="video-js vjs-default-skin noscroll" controls preload="none">

JavaScript - 初期化:

var DEFAULT_OPTIONS = { controls: true, autoplay: false, preload: "none", loop: false };

var videoPlayer = null;

try {
  videoPlayer = _V_("video_player", DEFAULT_OPTIONS, function() {
    log("Video ready");
  });
} catch (error) {
  dumpError("Problem with initialisation", error);
}

try {
  log("DEBUG:  Setting up video");
  videoPlayer.addEvent("loadstart", function() {
    try {
      dumpArguments("loadstart", arguments);
    } catch (error) {
      dumpError("Failed to process loadstart", error);
    }
  });
  videoPlayer.addEvent("loadedmetadata", function() {
    try {
      dumpArguments("loadedmetadata", arguments);
    } catch (error) {
      dumpError("Failed to process loadedmetadata", error);
    }
  });
  videoPlayer.addEvent("loadeddata", function() {
    try {
      dumpArguments("loadeddata", arguments);
    } catch (error) {
      dumpError("Failed to process loadeddata", error);
    }
  });
  videoPlayer.addEvent("loadedalldata", function() {
    try {
      dumpArguments("loadedalldata", arguments);
    } catch (error) {
      dumpError("Failed to process loadedalldata", error);
    }
  });
  videoPlayer.addEvent("progress", function() {
    try {
      dumpArguments("progress", arguments);
    } catch (error) {
      dumpError("Failed to process progress", error);
    }
  });
  videoPlayer.addEvent("error", function() {
    try {
      dumpArguments("error", arguments);
    } catch (error) {
      dumpError("Failed to process error", error);
    }
  });
} catch (error) {
  dumpError("Error setting up video controller", error);
}

JavaScript - 再生用のビデオのセットアップ

APP.avPlayer.video.src(cachedFileRecord.URL);

APP.avPlayer.video は、初期化の最後に作成されるビデオ プレーヤーのグローバル参照です。

ときどきビデオが起動し、そのセッションには適していますが、アプリを再起動すると問題が再発します。

私はモバイル開発と JavaScript (および iOS、Cordova など) の世界には不慣れですが、開発には不慣れです。間違った順序で何かを行っているのでしょうか、それとも Java の長い歴史が原因で、 JavaScript の動作に関する間違った仮定ですか?

ああ、そして後世のための最後の事実として、コードは BlackBerry で問題なく動作するため、これは間違いなく iOS プラットフォームに関連するものですが、5.1、6.0、および 6.1 はすべてシミュレーターとデバイスで失敗します。

4

1 に答える 1

1

問題の根底にたどり着くことができなかったので、他の誰かがこの問題を抱えている場合の将来の参考のために、次のようにすべてを動的に構築することで解決しました。

    // Get the place we will mount the video
    var home = $("#videoInsert");
    // Remove previous player, TODO Release first
    home.empty();

    // Create the new content
    var player = $('<video></video>');
    var videoId = "video" + playerCounter++;
    player.attr("id", videoId);
    player.attr("class", "video-js vjs-default-skin noscroll");
    player.attr("controls", "true");
    player.attr("autoplay", "false");
    player.attr("preload", "auto");
    player.attr("data-setup", "{}");

    // Add the optional poster if supplied
    if (arguments.length > 2) {
      player.attr("poster", posterUrl);
    }

    // Set the media up
    var media = $("<source />");
    media.attr("src", "file://" + videoUrl);
    media.attr("type", mimeType);
    player.append(media);

    // Finally add the player to the page
    home.append(player);

    try {
      target = _V_(videoId, null, function() {
    log("Video ready");
    attachEventListeners(this);
    resize(this);
      });
    } catch (error) {
      dumpError("Problem with initialisation", error);
    }

HTML と JS の初期化に関する何かが競合していたようですが、純粋な JS の初期化で問題が解決しました。

于 2013-02-27T09:42:30.150 に答える