我正在研究通过公对公音频插孔电缆传输文本数据.
我正在HTC one V和PC上进行测试,它支持用于数据传输的公对公音频插孔,如本维基百科文章所述.它说:
第一个将返回信号放在第二个环上,麦克风放在套管上,用于Apple的iPhone系列,HTC设备,最新的三星,诺基亚和索尼手机等.
你可以在这里看到我的代码.
转移过程中遇到的问题:如果我通过输入发送方0-31之间的任何值生成音调,由于错误的FSK调制/解调类型,接收器将在2-3次尝试中获得实际值.你会建议最好的纠错码,它可以帮助我纠正从另一个Android设备收到的输入吗?
如果有人之前已经完成过这种类型的数据传输,请提供代码参考或有关技术方面的一些基本指导,因此我可以完成此操作并使其成为每个人的开源.
android android-mediarecorder android-audiomanager android-audiorecord
我正在使用Android vision API中的FaceTracker示例.但是,我在录制视频时遇到了困难,同时在它们上面绘制了叠加层.
一种方法是将位图存储为图像并使用FFmpeg或Xuggler将它们合并为视频,但我想知道如果我们可以在预计投影时在运行时录制视频,是否有更好的解决方案.
更新1: 我使用媒体记录器更新了以下类,但录制仍然无法正常工作.当我调用triggerRecording()函数时抛出以下错误:
MediaRecorder:以无效状态调用:4
我在清单文件中有外部存储权限.
更新2:
我在代码中修复了上述问题,并在onSurfaceCreated回调中移动了setupMediaRecorder().但是,当我停止录制时,它会抛出运行时异常.根据文档,如果没有视频/音频数据,将抛出运行时异常.
那么,我在这里错过了什么?
public class CameraSourcePreview extends ViewGroup {
private static final String TAG = "CameraSourcePreview";
private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
static {
ORIENTATIONS.append(Surface.ROTATION_0, 90);
ORIENTATIONS.append(Surface.ROTATION_90, 0);
ORIENTATIONS.append(Surface.ROTATION_180, 270);
ORIENTATIONS.append(Surface.ROTATION_270, 180);
}
private MediaRecorder mMediaRecorder;
/**
* Whether the app is recording video now
*/
private boolean mIsRecordingVideo;
private Context mContext;
private SurfaceView mSurfaceView;
private boolean mStartRequested;
private boolean mSurfaceAvailable;
private CameraSource mCameraSource; …
Run Code Online (Sandbox Code Playgroud) android android-camera android-mediarecorder google-vision android-vision
我试图使用AudioRecord
与AudioSource.VOICE_DOWNLINK
在Nexus 5X的Android 7.1(我自己的构建从AOSP).
我已经超过了权限阶段 - 将我的APK移动到特权应用程序,AudioRecord
在Android源代码中进行了调整以停止抛出有关此源的异常.
现在我在通话期间得到空录音缓冲区.
我知道有很多通话录音应用程序,它们可以在其他设备上运行.我也看到某些应用程序可以对已植根的N5执行某些操作并使其正常工作.
我希望在Nexus 5X上实现同样的目标 - 任何调整对我来说都可以,包括更改Android版本,修改Qualcomm驱动程序,设备配置文件等等 - 基本上可以在自定义ROM中实现.
我已经尝试过使用平台代码 - 硬件/ qcom/audio/hal/voice.c,特别是功能voice_check_and_set_incall_rec_usecase
,但到目前为止还没有意义.
还检查了device/lge/bullhead/mixer_paths.xml,发现有一个与呼叫记录相关的部分:
<!-- Incall Recording -->
<ctl name="MultiMedia1 Mixer VOC_REC_UL" value="0" />
<ctl name="MultiMedia1 Mixer VOC_REC_DL" value="0" />
<ctl name="MultiMedia8 Mixer VOC_REC_UL" value="0" />
<ctl name="MultiMedia8 Mixer VOC_REC_DL" value="0" />
<!-- Incall Recording End -->
Run Code Online (Sandbox Code Playgroud)
但我也无法理解它或它是如何得到帮助的.
android alsa android-mediarecorder android-audiorecord android-rom
我正在使用MediaRecorder录制视频.我的代码在2.3.3上工作正常但在4.0.3上失败.
问题如下:代码mediaRecorder.stop()抛出RuntimeExeption
java.lang.RuntimeException: stop failed.
at android.media.MediaRecorder.stop(Native Method)
Run Code Online (Sandbox Code Playgroud)
使用LogCat消息
04-05 15:10:51.815: E/MediaRecorder(15709): stop failed: -1007
Run Code Online (Sandbox Code Playgroud)
UPDATE
我发现,MediaPlayer几乎在启动后立即报告错误(通过MediaPlayer.OnErrorListener).错误代码为100(媒体服务器死机),额外-1007.
更新2准备MediaRecorder的代码
c = Camera.open();
...
// Step 1: Unlock and set camera to MediaRecorder
camera.unlock();
mediaRecorder.setCamera(camera);
// Step 2: Set sources
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
CamcorderProfile profile = CamcorderProfile
.get(CamcorderProfile.QUALITY_HIGH);
// manual set up!
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
mediaRecorder.setVideoSize(profile.videoFrameWidth,
profile.videoFrameHeight);
mediaRecorder.setAudioChannels(profile.audioChannels);
mediaRecorder.setAudioEncodingBitRate(profile.audioBitRate);
mediaRecorder.setAudioSamplingRate(profile.audioSampleRate);
mediaRecorder.setAudioEncoder(profile.audioCodec);
//mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mediaRecorder.setVideoEncoder(profile.videoCodec);
// mediaRecorder.setProfile(profile);
// Step 4: Set output file …
Run Code Online (Sandbox Code Playgroud) 我试图找出一个录制音频的例子,数据存储由应用程序处理,而不是MediaRecorder
.用例包括将记录存储在内部存储器或加密记录.
原则上,这应该使用createPipe()
on 创建的管道ParcelFileDescriptor
,但我得到输出格式错误.
首先,这是一个示例项目,使用"自然"记录MediaRecorder
,MediaRecorder
直接写入外部存储上的输出文件.这个应用程序工作得很好,输出可以由记录它的Android设备或我的Linux机器上的VLC播放.
这是我createPipe()
对这个项目的变化.从一般MediaRecorder
配置(例如setOutputFormat()
)的角度来看,它与第一个相同,因此代码可能是正确的.
但是,我通过以下方式提供输出:
recorder.setOutputFile(getStreamFd());
Run Code Online (Sandbox Code Playgroud)
在getStreamFd()
使用的地方createPipe()
,产生一个后台线程来从管道中读取,并返回写入结束以供以下用户使用MediaRecorder
:
private FileDescriptor getStreamFd() {
ParcelFileDescriptor[] pipe=null;
try {
pipe=ParcelFileDescriptor.createPipe();
new TransferThread(new AutoCloseInputStream(pipe[0]),
new FileOutputStream(getOutputFile())).start();
}
catch (IOException e) {
Log.e(getClass().getSimpleName(), "Exception opening pipe", e);
}
return(pipe[1].getFileDescriptor());
}
Run Code Online (Sandbox Code Playgroud)
TransferThread
是一个经典的java.io
流到流复制例程,增加了智能来刷新和同步输出文件:
static class TransferThread extends Thread {
InputStream in;
FileOutputStream out;
TransferThread(InputStream in, FileOutputStream out) {
this.in=in; …
Run Code Online (Sandbox Code Playgroud) 我用棒棒糖扎根了 Nexus手机.我正在尝试记录来电和去电.
我的申请延伸DeviceAdminReceiver
到政策<force-lock />
我能够创建大小> 0bytes的文件.但是当我玩它时,它是空白的.
请看下面的代码:
的Manifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.STORAGE" />
.....
<service android:name=".RCService"
android:exported="false" >
</service>
.....
<receiver
android:name=".utils.MyDeviceAdminReceiver"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<intent-filter>
<!-- This action is required -->
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
<action android:name="android.app.action.DEVICE_ADMIN_DISABLED" />
<action android:name="android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED" />
</intent-filter>
<!-- This is required this receiver to become device admin component. -->
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
</receiver>
<receiver android:name=".CallRecoderBroadcast">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.NEW_OUTGOING_CALL" …
Run Code Online (Sandbox Code Playgroud) 我正在使用自动呼叫记录器应用程序,我能够在android 6下面使用记录语音呼叫MediaRecorder.AudioSource.VOICE_CALL
,从android 6无法使用VOICE_CALL记录语音呼叫.我设法录音使用,MediaRecorder.AudioSource.MIC
但这里传入的声音没有被记录,我想在正常模式下录制语音通话,而不是在扬声器模式下.请帮帮我.(我曾尝试过Xiomi Redmi 4a(机器人6),没有工作).
myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
myRecorder.setMaxDuration(60 * 60 * 1000);
AudioManager audiomanager =
(AudioManager)getSystemService(AUDIO_SERVICE);
audiomanager.setMode(2);
Run Code Online (Sandbox Code Playgroud)
编辑:权限没有问题.
更新:任何人都知道如何强制另一个流到MIC音频源.这需要原生的android代码.请帮我解决此 问题.有关路由音频的详细信息,请参阅此问题
我想在不使用提取器的情况下解码视频帧.所以我只尝试了一个小样本,我在那里使用了媒体提取器,但我没有 extractor.readsample()
将比特流数据复制到输入缓冲区而是使用FFmpeg解析器,在JNI中,我将视频帧记忆到输入字节缓冲区然后排队输入缓冲区..但是当我调用时decoder.dequeueOutputBuffer(info, 10000)
,它返回MediaCodec.INFO_TRY_AGAIN_LATER
.虽然我使用它可以正常工作extractor.readsample()
.
请在下面找到以下代码段:
Java方面:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import android.app.Activity;
import android.media.MediaCodec;
import android.media.MediaCodec.BufferInfo;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class VideoBrowser extends Activity implements SurfaceHolder.Callback {
private static final String SAMPLE = Environment.getExternalStorageDirectory() + "/obama.mp4";
private PlayerThread mPlayer = null;
private static native <jintArray> int AVinitializecntxt(String strl, jintArray arr);
private native int AVREADVIDEO(byte[] array); …
Run Code Online (Sandbox Code Playgroud) 我搜索很多但没有找到任何解决方案.我的问题是如何在录制时向视频添加文字,这样我们就可以在看到视频时获得相同的文字.当我看到捕捉视频时,我想要这样的东西.
目前我正在分时间和视频.所以问题是如何结合它.任何一种帮助将不胜感激.谢谢你提前..
我用android Mediarecorder录制了一个视频.
(主要问题:我需要知道视频的确切startTime [系统时间]和endTime [系统时间],[endTime - startTime]必须与实际视频的持续时间相匹配)
MediaRecorder.start
startTime = System.currentTimeMillis()
then on stop
MediaRecorder.stop
endTime = System.currentTimeMillis()
Run Code Online (Sandbox Code Playgroud)
我期待视频有这段时间
expected_duration =(endTime - startTime)
然而
expected_duration总是超过视频的实际持续时间.
我怀疑MediaRecorder.start很慢,它实际上开始将帧写入视频需要一些时间.
那么现在,当MediaRecorder开始将第一帧写入视频时,是否有通知?或者有什么方法可以找出视频实际开始录制时的确切系统开始时间.
感谢阅读,并感谢任何意见,建议或意见.^^