标签: android-mediarecorder

通过两个Android设备上的音频插孔电缆传输数据

我正在研究通过公对公音频插孔电缆传输文本数据.

我正在HTC one V和PC上进行测试,它支持用于数据传输的公对公音频插孔,如本维基百科文章所述.它说:

第一个将返回信号放在第二个环上,麦克风放在套管上,用于Apple的iPhone系列,HTC设备,最新的三星,诺基亚和索尼手机等.

你可以在这里看到我的代码.

转移过程中遇到的问题:如果我通过输入发送方0-31之间的任何值生成音调,由于错误的FSK调制/解调类型,接收器将在2-3次尝试中获得实际值.你会建议最好的纠错码,它可以帮助我纠正从另一个Android设备收到的输入吗?

如果有人之前已经完成过这种类型的数据传输,请提供代码参考或有关技术方面的一些基本指导,因此我可以完成此操作并使其成为每个人的开源.

android android-mediarecorder android-audiomanager android-audiorecord

38
推荐指数
1
解决办法
1万
查看次数

使用Google Vision API的媒体记录器

我正在使用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

35
推荐指数
1
解决办法
2523
查看次数

通话录音 - 使其适用于Nexus 5X(可以使用root或自定义ROM)

我试图使用AudioRecordAudioSource.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

34
推荐指数
1
解决办法
1108
查看次数

MediaRecorder.stop()停止失败:-1007

我正在使用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)

android video-capture mediarecorder android-mediarecorder

28
推荐指数
2
解决办法
2万
查看次数

任何人都有MediaRecorder使用ParcelFileDescriptor和createPipe()?

我试图找出一个录制音频的例子,数据存储由应用程序处理,而不是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)

android android-mediarecorder

22
推荐指数
1
解决办法
5725
查看次数

无法使用MediaRecorder录制通话

我用棒棒糖扎根了 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)

java android android-mediarecorder

22
推荐指数
1
解决办法
914
查看次数

Android通话录音未录制来电语音

我正在使用自动呼叫记录器应用程序,我能够在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代码.请帮我解决此 问题.有关路由音频的详细信息,请参阅此问题

android native phone-call android-ndk android-mediarecorder

22
推荐指数
1
解决办法
2万
查看次数

无需使用媒体提取器,无法在Android 4.2上对视频进行低级解码

我想在不使用提取器的情况下解码视频帧.所以我只尝试了一个小样本,我在那里使用了媒体提取器,但我没有 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 video-processing decoding android-mediarecorder

20
推荐指数
1
解决办法
1341
查看次数

如何在视频录制中添加文字?

我搜索很多但没有找到任何解决方案.我的问题是如何在录制时向视频添加文字,这样我们就可以在看到视频时获得相同的文字.当我看到捕捉视频时,我想要这样的东西. 在此输入图像描述 目前我正在分时间和视频.所以问题是如何结合它.任何一种帮助将不胜感激.谢谢你提前..

android android-intent android-camera android-mediarecorder

16
推荐指数
1
解决办法
6788
查看次数

Android Mediarecorder录制的视频时长与预期持续时间不同

我用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开始将第一帧写入视频时,是否有通知?或者有什么方法可以找出视频实际开始录制时的确切系统开始时间.

感谢阅读,并感谢任何意见,建议或意见.^^

android mediarecorder android-mediarecorder

16
推荐指数
1
解决办法
1081
查看次数