每当我播放媒体时,它都会在DDMS中显示警告 Should have subtitle controller already set
我的代码:
private void start() {
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.stop();
mp.release();
}
});
}
Run Code Online (Sandbox Code Playgroud)
DDMS日志
应该已经设置了字幕控制器
信息/警告(2,0)
当我在Google上搜索时,甚至没有一个与之相关的主题.我怎样才能摆脱或禁用它?
我有以下代码:
AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3");
player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor());
player.prepare();
player.start();
Run Code Online (Sandbox Code Playgroud)
问题是,当我运行这段代码时,它会按字母顺序开始播放资源目录中的所有音频文件,而不是只播放我请求的音频文件.我究竟做错了什么?有没有更好的方法从资源目录播放音频文件?
后续问题:将音频文件保存在资源目录中并将它们保存在res/raw目录中是否有区别?除了他们没有获得ID,如果他们在资产目录中的事实.如果我将音频文件移动到res/raw文件夹,那么我有一个重用MediaPlayers 的问题,因为没有id参数setDataSource().我找不到处理这类问题的好指南.
我目前正在尝试设计一个简单的应用程序,流媒体互联网广播电台.我有电台的URL,我正在设置媒体播放器
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(URL);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
Run Code Online (Sandbox Code Playgroud)
模拟时程序没有崩溃,但没有播放,我收到以下错误:
start called in state 0
Run Code Online (Sandbox Code Playgroud)
就在它下面
Error (-38,0)
Run Code Online (Sandbox Code Playgroud)
有谁知道这意味着什么?
我已经阅读了一些有关这些状态错误的内容,但找不到任何适用于我的项目的内容.
我想知道在流媒体视频方面它们之间是否存在差异.
我知道VideoView可以用于流媒体和什么是Mediaplayer?据我所知,MediaPlayer可以做同样的事情VideoView吗?
任何人都可以给我答案吗?
如果我想通过使用RTSP到服务器从服务器流式传输视频,我应该从哪个开始?VideoView还是MediaPlayer?
有什么建议吗?
单击时如何从原始按钮播放声音按钮?我刚刚创建了一个带id的按钮button1,但无论我写的代码是什么,都是错的.
import android.media.MediaPlayer;
public class BasicScreenActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_basic_screen);
}
Button one = (Button)this.findViewById(R.id.button1);
MediaPlayer = mp;
mp = MediaPlayer.create(this, R.raw.soho);
zero.setOnCliclListener(new View.OnClickListener() )
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.basic_screen, menu);
return true;
}
}
Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用Android内置的MediaPlayer类来流式传输mp3.文档会告诉我,这应该像以下一样简单:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(URL_OF_FILE);
mp.prepare();
mp.start();
Run Code Online (Sandbox Code Playgroud)
但是我反复得到以下内容.我也尝试过不同的URL.请不要告诉我流式传输不适用于mp3.
E/PlayerDriver( 31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
W/PlayerDriver( 31): PVMFInfoErrorHandlingComplete
E/MediaPlayer( 198): error (1, -4)
E/MediaPlayer( 198): start called in state 0
E/MediaPlayer( 198): error (-38, 0)
E/MediaPlayer( 198): Error (1,-4)
E/MediaPlayer( 198): Error (-38,0)
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢,谢谢S
我正在制作一个可以显示视频的动态壁纸.一开始我认为这将非常困难,所以有些人建议使用OpenGL解决方案或其他非常复杂的解决方案(例如这个).
无论如何,为此,我发现了各种各样的地方,并且基于这个github库(它有一些bug),我终于得到了它的工作.
虽然我成功地显示了一个视频,但我无法找到控制它与屏幕分辨率相比如何显示的方法.
目前它总是被拉伸到屏幕尺寸,这意味着这个(从这里拍摄的视频):
得到如下:
原因是不同的宽高比:560x320(视频分辨率)与1080x1920(设备分辨率).
注意:我很清楚缩放视频的解决方案,这些解决方案可以在各种Github存储库中找到(例如这里),但我问的是一个动态壁纸.因此,它没有View,所以它对如何做事更加有限.更具体地说,解决方案不能具有任何类型的布局,TextureView或SurfaceView或任何其他类型的View.
我尝试使用SurfaceHolder的各种领域和功能,但到目前为止没有运气.例子:
setVideoScalingMode - 它要么崩溃要么不做任何事情.
改变surfaceFrame - 相同.
这是我目前的代码(这里有完整的项目):
class MovieLiveWallpaperService : WallpaperService() {
override fun onCreateEngine(): WallpaperService.Engine {
return VideoLiveWallpaperEngine()
}
private enum class PlayerState {
NONE, PREPARING, READY, PLAYING
}
inner class VideoLiveWallpaperEngine : WallpaperService.Engine() {
private var mp: MediaPlayer? = null
private var playerState: PlayerState = PlayerState.NONE
override fun onSurfaceCreated(holder: SurfaceHolder) {
super.onSurfaceCreated(holder)
Log.d("AppLog", "onSurfaceCreated")
mp = …Run Code Online (Sandbox Code Playgroud) 我有3秒的mp3文件.我想连续播放那个mp3文件,用户点击暂停按钮.是否有任何方法循环单个文件并再次播放它,直到用户暂停它.
我有一个简单的播放器和录音机.一切都很好,但有一个问题.我想添加搜索栏以查看播放记录的进度,并使用此搜索栏来设置播放器应该播放的位置.我有onProgress但没有效果.这是代码:
package com.example.recorder;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class MainActivity extends Activity implements OnSeekBarChangeListener
{
private static final String LOG_TAG = "AudioRecordTest";
private static String mFileName = null;
private SeekBar seekBar;
private MediaRecorder mRecorder = null;
private Button startRecord, startPlaying, stopPlaying;
private MediaPlayer mPlayer = null;
private void onRecord(boolean start) {
if (start) {
startRecording();
} else {
stopRecording();
} …Run Code Online (Sandbox Code Playgroud) 我发现Android MediaPlayer准备使用不同的流进行实时流播放所花费的时间差异很大.
硬数据
我在prepareAsync()和onPrepared(MediaPlayer mp)回调之间添加了日志记录,并且每次都测试了几个流.每个流的时间非常一致(+/- 1秒),结果如下:
测试是在带有Android 2.3.4的Nexus S上进行的3G连接(~1100 Kbps).
播放非流式MP3音频文件不是问题.
以下是我如何播放流的片段:
准备MediaPlayer:
...
mediaPlayer.setDataSource(playUrl);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();
...
Run Code Online (Sandbox Code Playgroud)
然后在onPrepared(MediaPlayer mp):
mediaPlayer.start();
Run Code Online (Sandbox Code Playgroud)
为什么要准备一些流而不是其他流需要这么长时间?上述数据似乎表明它可能基于已缓冲的数据量而不是缓冲的音频内容的持续时间.真的可以吗?
更新:我已经使用Android 1.6,2.2和2.3.4以及1.6,2.1,2.2,2.3.1和2.3.3的仿真器测试了物理设备上的实时流媒体.我只看到2.3.3和2.3.4的长时间延迟.旧版本在5秒内开始播放.