android电视框架中libvlc android和tvplayer的问题

xj3cbfub  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(809)

我正在尝试设计一个小模块来接收rtp流量,并将其显示在android电视的直播频道应用程序中。有问题的应用程序接收声音和一切,但当涉及到在屏幕上绘制图像,这发生在我的记录。
日志:

  1. 08-23 02:03:06.339 31050 31195 E VLC : [e6831cb0/79db] libvlc window: request 1 not implemented
  2. 08-23 02:03:06.339 31050 31195 D VLC : [d573bc30/79db] libvlc vout display: VoutDisplayEvent 'resize' 1920x1080
  3. 08-23 02:03:06.339 31050 31195 D VLC : [e6831db0/79db] libvlc gl: looking for opengl es2 module matching "any": 1 candidates
  4. 08-23 02:03:06.341 31050 31195 D VLC : [e6831db0/79db] libvlc gl: no opengl es2 modules matched
  5. 08-23 02:03:06.341 31050 31195 E VLC : [e6831cb0/79db] libvlc window: request 1 not implemented
  6. 08-23 02:03:06.341 31050 31195 D VLC : [d573bc30/79db] libvlc vout display: VoutDisplayEvent 'resize' 1920x1080
  7. 08-23 02:03:06.341 31050 31195 D VLC : [d573bc30/79db] libvlc vout display: no vout display modules matched
  8. 08-23 02:03:06.341 31050 31098 E VLC : [ed07a330/797a] libvlc video output: video output creation failed
  9. 08-23 02:03:06.343 31050 31098 D VLC : [d5751cb0/797a] libvlc spu text: removing module "freetype"
  10. 08-23 02:03:06.345 31050 31098 D VLC : [d5753830/797a] libvlc scale: removing module "yuvp"
  11. 08-23 02:03:06.345 31050 31098 D VLC : [d5752bb0/797a] libvlc scale: removing module "swscale"
  12. 08-23 02:03:06.346 31050 31098 E VLC : [e684a730/797a] libvlc decoder: failed to create video output

appplayer.java文件:

  1. /*
  2. * Copyright 2016 The Android Open Source Project.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package io.neirth.player;
  17. import android.content.Context;
  18. import android.content.res.Resources;
  19. import android.media.PlaybackParams;
  20. import android.net.Uri;
  21. import android.util.DisplayMetrics;
  22. import android.view.Surface;
  23. import android.view.SurfaceView;
  24. import com.google.android.media.tv.companionlibrary.TvPlayer;
  25. import org.videolan.libvlc.IVLCVout;
  26. import org.videolan.libvlc.LibVLC;
  27. import org.videolan.libvlc.Media;
  28. import org.videolan.libvlc.MediaPlayer;
  29. import java.util.ArrayList;
  30. /**
  31. * A wrapper around ExoPlayer which implements TvPlayer. This is the class that actually renders
  32. * the video, subtitles and all these sorts of things.
  33. */
  34. public class AppPlayer implements TvPlayer {
  35. private LibVLC libVlc;
  36. private MediaPlayer player;
  37. /**
  38. * AppPlayer constructor
  39. * @param context Context
  40. */
  41. public AppPlayer(Context context) {
  42. ArrayList<String> options = new ArrayList<>();
  43. options.add("-vv");
  44. options.add("--aout=opensles");
  45. libVlc = new LibVLC(context, options);
  46. player = new MediaPlayer(libVlc);
  47. }
  48. /**
  49. * Load media
  50. * @param mediaUri Media URI
  51. */
  52. public void loadMedia(String mediaUri) {
  53. loadMedia(Uri.parse(mediaUri));
  54. }
  55. /**
  56. * Load media
  57. * @param mediaUri Media URI
  58. */
  59. public void loadMedia(Uri mediaUri) {
  60. final Media media = new Media(libVlc, mediaUri);
  61. media.setHWDecoderEnabled(true, false);
  62. media.addOption(":clock-jitter=0");
  63. media.addOption(":clock-synchro=0");
  64. media.addOption(":network-caching=1000"); // In milliseconds
  65. media.addOption(":sout-keep");
  66. media.addOption(":audio-time-stretch");
  67. player.setMedia(media);
  68. media.release();
  69. }
  70. /**
  71. * Release player
  72. */
  73. public void release() {
  74. player.release();
  75. libVlc.release();
  76. }
  77. /**
  78. * Set surface
  79. * @param surface Video surface
  80. */
  81. @Override
  82. public void setSurface(Surface surface) {
  83. final IVLCVout vlcVout = player.getVLCVout();
  84. if (surface != null) {
  85. DisplayMetrics dm = Resources.getSystem().getDisplayMetrics();
  86. vlcVout.setVideoSurface(surface,null);
  87. vlcVout.setWindowSize(dm.widthPixels, dm.heightPixels);
  88. vlcVout.attachViews();
  89. } else {
  90. vlcVout.detachViews();
  91. }
  92. }
  93. /**
  94. * Get current position
  95. * @return Current position in milliseconds
  96. */
  97. @Override
  98. public long getCurrentPosition() {
  99. return (long) (player.getPosition() * 1000);
  100. }
  101. /**
  102. * Get duration
  103. * @return Duration in milliseconds
  104. */
  105. @Override
  106. public long getDuration() {
  107. return player.getLength();
  108. }
  109. /**
  110. * Start or resume player
  111. */
  112. @Override
  113. public void play() {
  114. player.play();
  115. }
  116. /**
  117. * Pause player
  118. */
  119. @Override
  120. public void pause() {
  121. player.pause();
  122. }
  123. /**
  124. * Stop player
  125. */
  126. public void stop() {
  127. player.stop();
  128. }
  129. /**
  130. * Seek to
  131. * @param position Position in milliseconds
  132. */
  133. @Override
  134. public void seekTo(long position) {
  135. float pos = (float) position;
  136. pos /= 1000;
  137. player.setPosition(pos);
  138. }
  139. /**
  140. * Set volume
  141. * @param volume Volume between 0 and 1
  142. */
  143. @Override
  144. public void setVolume(float volume) {
  145. player.setVolume((int) (volume * 100));
  146. }
  147. @Override
  148. public void setPlaybackParams(PlaybackParams params) {}
  149. @Override
  150. public void registerCallback(Callback callback) {}
  151. @Override
  152. public void unregisterCallback(Callback callback) {}
  153. }

如果能回答这个问题,我将不胜感激。

rqcrx0a6

rqcrx0a61#

问题来自你的 setSurface() 方法。
这是一个独立的工作示例

  1. import android.os.Bundle;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import org.videolan.libvlc.LibVLC;
  4. import org.videolan.libvlc.Media;
  5. import org.videolan.libvlc.MediaPlayer;
  6. import org.videolan.libvlc.util.VLCVideoLayout;
  7. import java.io.IOException;
  8. import java.util.ArrayList;
  9. public class JavaActivity extends AppCompatActivity {
  10. private static final boolean USE_TEXTURE_VIEW = false;
  11. private static final boolean ENABLE_SUBTITLES = true;
  12. private static final String ASSET_FILENAME = "bbb.m4v";
  13. private VLCVideoLayout mVideoLayout = null;
  14. private LibVLC mLibVLC = null;
  15. private MediaPlayer mMediaPlayer = null;
  16. @Override
  17. protected void onCreate(Bundle savedInstanceState) {
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.activity_main);
  20. final ArrayList<String> args = new ArrayList<>();
  21. args.add("-vvv");
  22. mLibVLC = new LibVLC(this, args);
  23. mMediaPlayer = new MediaPlayer(mLibVLC);
  24. mVideoLayout = findViewById(R.id.video_layout);
  25. }
  26. @Override
  27. protected void onDestroy() {
  28. super.onDestroy();
  29. mMediaPlayer.release();
  30. mLibVLC.release();
  31. }
  32. @Override
  33. protected void onStart() {
  34. super.onStart();
  35. mMediaPlayer.attachViews(mVideoLayout, null, ENABLE_SUBTITLES, USE_TEXTURE_VIEW);
  36. try {
  37. final Media media = new Media(mLibVLC, getAssets().openFd(ASSET_FILENAME));
  38. mMediaPlayer.setMedia(media);
  39. media.release();
  40. } catch (IOException e) {
  41. throw new RuntimeException("Invalid asset folder");
  42. }
  43. mMediaPlayer.play();
  44. }
  45. @Override
  46. protected void onStop() {
  47. super.onStop();
  48. mMediaPlayer.stop();
  49. mMediaPlayer.detachViews();
  50. }
  51. }
展开查看全部

相关问题