- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我必须播放音频文件。哪个在 zip 文件中,哪个存在于 sdcard 中。并且音频文件是加密的。因此,在解密音频时,我将获取输入流中的数据。
我不想解压缩,因为它会占用磁盘空间。
正如我所调查的,如果我有流媒体,我没有得到关于如何直接播放音频的线索。它只能通过网络。在这种情况下不是。
所以我的想法是生成一个线程,该线程将不断向文件追加数据(字节)。开始时,我调用 MediaadPlayer
开始它的工作。
媒体播放器运行良好。乐趣从这里开始:假设音频文件在 6 分钟 - 5MB 内。缓冲可能发生了 2MB。在搜索栏中,我可以看到 2 分钟是我的最长持续时间。这是完全正确的。当缓冲仍在继续..发生时,我想更新搜索栏中的时间及其长度(搜索栏长度)与给定时间成正比。我该怎么做。
我为此尝试了 OnBufffering,它没有用。我猜它实际上是用于流式音频文件,如果它通过网络播放的话。
请给我一些简单的解决方案,如何完成?不要让我覆盖 MediaPlayer
类并处理它。
感谢任何帮助。如果您需要更清楚地了解这一点,请告诉我。
public class NotesAudDisplay extends Activity implements OnPreparedListener, MediaController.MediaPlayerControl{
private static final String TAG = "activity-NotesAudioDisplay";
private String audioFilePath;
private String notesFileName;
private String mcfFileName;
private String key;
private SeekBar seekBarProgress;
private NotesElement notesElement = null;
private String notesTittle = "", notesHeading = "";
private TextView heading_tv, playerStatus_tv;
private QuesBuilder qb = null;
private MediaPlayer mediaPlayer = null;
private MediaController mediaController;
private Drawable play_butt, pause_butt;
private ProgressDialog pd;
private Resources res = null;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.audio_notesdisplay);
res = getResources();
play_butt = res.getDrawable(R.drawable.play);
pause_butt = res.getDrawable(R.drawable.pause);
heading_tv = (TextView) findViewById(R.id.notesHeading_tv);
playerStatus_tv = (TextView) findViewById(R.id.playerStatus_tv);
Intent intent = getIntent();
notesTittle = intent.getStringExtra("notesTittle");
notesFileName = intent.getStringExtra("notesFileName");
mcfFileName = intent.getStringExtra("mcfFileName");
key = intent.getStringExtra("key");
TextView tittle_tv = (TextView) findViewById(R.id.notesTittle_tv);
tittle_tv.setText(notesTittle);
NotesXMLParser nxp = new NotesXMLParser(this, notesFileName,
mcfFileName, key);
nxp.OpenXmlDocument();
notesElement = nxp.getNotesContent();
Log.d("TAG", "notesele:" + notesElement);
if (notesElement != null) {
notesHeading = notesElement.getHeading();
heading_tv.setText(notesHeading);
QuesBuilderSet qbs = notesElement.getNotesStatement();
ArrayList quesBuilder = qbs.getQuesBuilderSet();
if (quesBuilder != null) {
Log.d(TAG, " quesBuilder len:" + quesBuilder.size());
for (int i = 0; i < quesBuilder.size(); i++) {
qb = (QuesBuilder) quesBuilder.get(i);
if (qb.getType() == QuesBuilder.SPEECH) {
Log.d(TAG, " AUDIO");
String file = qb.getQuesSpeech();
File f = createTmpAudioFile(file);
boolean decrypt_result = false;
if (f != null) {
new LongOperation().execute(f);
Log.d(TAG,"****before long operation****");
try {
Log.d(TAG,"****before thread operation****");
Thread.sleep(3000);
Log.d(TAG,"****after thread operation****");
setContent();
} catch (Exception e) {
Log.d("InstructionForm", "Sleep thread fails");
}
Log.d(TAG,"****after catch****");
} else {
heading_tv.setText(notesHeading
+ " Unable to play the audio.");
}
} else {
Log.d(TAG, " other:" + qb.getType());
}
}
}
}
}// onCreate
public void setContent() {
mediaController = new MediaController(NotesAudDisplay.this);
mediaPlayer = new MediaPlayer();
Log.d(TAG,"***GOING TO PREP STATE***");
mediaPlayer.setOnPreparedListener(NotesAudDisplay.this);
Log.d(TAG,"***DONE WITH PREP STATE***");
try {
mediaPlayer.setDataSource(audioFilePath);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepareAsync();
mediaPlayer.start();
playerStatus_tv.setText("Playing.. . ");
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private File createTmpAudioFile(String file) {
DBAdapter dba = new DBAdapter(NotesAudDisplay.this);
dba.open();
String mobiDataPath = dba.get_mobidata_path();
dba.close();
audioFilePath = mobiDataPath + "/" + file;
Log.d(TAG, "tmp audio filePath:" + audioFilePath);
File f = null;
try {
f = new File(audioFilePath);
return f;
} catch (Exception e) {
f = null;
Log.d(TAG, " exception caught in creating audio file on sdcard");
}
return null;
}
private class LongOperation extends AsyncTask<File, Void, Boolean> {
@Override
protected void onPreExecute() {
// TODO run small wheel
// show_wheel();
}
@Override
protected Boolean doInBackground(File... arg0) {
DecryptZipReader dr = new DecryptZipReader();
File f = arg0[0];
Log.d(TAG, "*********copying start*********");
boolean res = dr.getDecryptFileStream(NotesAudDisplay.this,
qb.getQuesSpeech(), mcfFileName, key, f);
return new Boolean(res);
}
@Override
protected void onPostExecute(Boolean result) {
// close_wheel();
Log.d(TAG, "*********copying stop*********");
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}
@Override
protected void onStop() {
super.onStop();
mediaPlayer.stop();
mediaPlayer.release();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//the MediaController will hide after 3 seconds - tap the screen to make it appear again
mediaController.show(0);
return false;
}
//--MediaPlayerControl methods----------------------------------------------------
public void start() {
mediaPlayer.start();
}
public void pause() {
mediaPlayer.pause();
}
public int getDuration() {
Log.d(TAG,"***duration:"+mediaPlayer.getDuration());
return mediaPlayer.getDuration();
}
public int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
}
public void seekTo(int i) {
mediaPlayer.seekTo(i);
}
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
public int getBufferPercentage() {
return 0;
}
public boolean canPause() {
return true;
}
public boolean canSeekBackward() {
return true;
}
public boolean canSeekForward() {
return true;
}
//--------------------------------------------------------------------------------
public void onPrepared(MediaPlayer mediaPlayer) {
Log.d(TAG, "*********onPrepared*********");
mediaController.setMediaPlayer(this);
mediaController.setAnchorView(findViewById(R.id.main_audio_view));
handler.post(new Runnable() {
public void run() {
mediaController.setEnabled(true);
mediaController.show(0);
}
});
}
}
最佳答案
Afaik,您可以从 zip 中获取一个 FileDescriptor,而无需使用 Google 的 ZipResource 库进行解压,它仅用于扩展包,但如果您只是存储项目而不压缩它,它就可以完美地工作 (zip -r -n .mp3:.png:.txt 命运起源)。
FileDescriptor 已准备好与 MediaPlayer 一起使用,但如果它的加密可能有两个描述符可能会帮助您优化解密通量。
public ZipResourceFile getExpansionFiles(Context context){
ZipResourceFile expansionFile = null;
try {
expansionFile = new ZipResourceFile(
Environment.getExternalStorageDirectory() + "/MyFolder" + "/" + "/MyFile" + ".zip");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}}
然后使用:ZipResourceFile z = getExpansionFiles(mContext);
AssetFileDescriptor afd = z.getAssetFileDescriptor(mItem +".mp3");
我希望它有所帮助,无论如何,您确定不想等到文件完全解密,然后再播放它而不用担心所有这些即时的头痛吗?
关于android - 如何在不解压缩整个文件的情况下从加密 zip 中的文件流式传输音乐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624504/
我正在使用框架的对象编写一个用于加密/解密的简单库。方法如下: public static byte[] Encrypt(byte[] key, byte[] vector, byte[] input
据我所知,RIM Crypto API 似乎只提供用于对称加密 (3Des) 的 PKCS5 填充模式。我正在使用 JDE 4.6.0。 我正在尝试为黑莓应用程序提供密码学,该应用程序需要与已经使用标
我已经获得了用于加密的 Java 实现,但遗憾的是我们是一家 .net 商店,我无法将 Java 整合到我们的解决方案中。可悲的是,我也不是 Java 专家,所以我已经为此苦苦挣扎了几天,我想我终于可
我正在尝试使用 KMS 和 AWS 加密 SDK 加密数据。查看 AWS documentation 中提供的示例,似乎没有地方可以明确设置数据 key 。 我找到了 EncryptionMateri
我目前有一个用于为我的网站制作哈希的代码,该代码使用 SALT 进行哈希处理,因此密码是不可逆的...... 目前它是 100% 为我的网站工作,它是使用 ASP.NET(C#) 编码的 这是我的代码
我想要做的是在 javascript 中生成一个 key 对,并在 PHP 中使用这些加密,然后用 JS 解密。 我在附加的代码中有两个问题 它不会从装甲文本块重新加载私钥 并且它不会解密 PHP 加
在进行密码哈希时,我有以下 node.js 代码。 body.password = covid@19 salt = "hello@world" body.passwordhex = crypto.cr
我想知道的是在配置文件中加密连接字符串的明确方法。以下是我的问题: 使用机器级加密,访问我的服务器的任何人都不能编写一个小的 .Net 程序来读取连接字符串的内容吗? 如果我将我的应用程序部署到企业环
我知道 rsync 可以在文件传输期间启用/禁用 ssh 加密协议(protocol)。那么,如果 ssh 加密协议(protocol)被禁用了,是不是意味着 rsync 根本不做任何加密呢? 另外,
脚本必须搜索网页内的字符串。但该脚本不应显示它正在搜索的字符串。我的意思是搜索字符串应该采用加密格式或任何其他格式。但如果没有该搜索字符串,则不应显示网页或应在页面上显示错误。 我要开发一个插件。如果
我正在尝试加密 MySQL 上的某些字段。我正在使用 TPC-DS 的 v2.8 版本,并尝试在客户地址表的某些列上使用 AES。知道如何加密字段的所有行吗?我尝试使用 UPDATE customer
我需要一个简单的 javascript 函数,它允许我使用 key 加密 textarea 数据( key 是存储为散列 session 变量的用户密码,由 PHP 打印到字段中) 我基本上希望在用户
如何在 JavaScript 中散列/加密字符串值?我需要一种机制来隐藏 localStorage/cookie 中的一些数据吗? 这与安全问题有关,但我想为我的数据提供一些保护。 最佳答案 有很多
我有一个程序,其中数据库的密码由远程用户设置。该程序将用户名和密码保存到 xml 文件中的加密字符串中,否则应该是人类可读的。现在,这工作正常,我使用带有 key 的 C# DES 加密,它被加密和解
Kotlin 中是否有任何关于椭圆曲线加密的信息? 用于生成 key 对和加密、解密消息。 关于这个主题的信息很少甚至没有。 例如,我想实现 ECC P-521 椭圆曲线。 是否可以在 Kotlin
所以我知道 MD5 在技术上是新应用程序的禁忌,但我随机想到了这个: 自 md5($password); 不安全,不会 md5(md5($password)) 是更好的选择?我使用它的次数越多,它会变
我一直在努力使用 crypto_secretbox_easy() 在 libsodium 中加密/解密一些数据| .我似乎找不到关于使用的任何好的文档。 我想从用户那里获取密码,用它来以某种方式制作
我正在做一个加密项目 视频,我对这个程序有几个问题。 我用命令转码mp4至HLS与 ts段持续时间约为 10 秒。 首先,我需要使用数据库中的 key 加密这些视频。然而, 我不知道是否使用 ffmp
我有一个加密/复制保护问题。 我正在为使用加密狗的公司编写应用程序。请不要告诉我软件保护是没有用的,或者我应该让它自由地飞向空中,或者我花任何时间这样做都是浪费;这不是关于软件保护有效性的哲学问题,更
我对 有一个疑问VIM 加密 key . 我有一个文本文件,我使用加密该文件 :X 现在,加密 key 的存储位置(路径)。 无论是存储在单独的文件中还是存储在文本文件本身中。 如果我打开文件,它会询
我是一名优秀的程序员,十分优秀!