如何在Android中通过FFmpeg解码音频

2023-12-02

我正在使用为 Android NDK 编译的 FFmpeg 编写一个 Android 播放器。

我可以通过 FFmpeg 打开该文件并写道:

av_register_all();

char* str = (*env) -> GetStringUTFChars(env, argv, 0);
__android_log_print(ANDROID_LOG_INFO, "HelloNDK!", str, str);

if (av_open_input_file (&pFormatCtx, str, NULL, 0, NULL) != 0)
    return -2; // Couldn't open file

// Retrieve stream information
if (av_find_stream_info(pFormatCtx) < 0)
    return -3; // Couldn't find stream information

// Dump information about file onto standard error
dump_format(pFormatCtx, 0, argv, 0);

// Find the first video stream
videoStream =- 1;
audioStream =- 1;
for (i = 0; i < pFormatCtx->nb_streams; i++) {
    if (pFormatCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO && audioStream <0) {
        audioStream = i;
    }
}

if (audioStream == -1)
    return -5;

aCodecCtx = pFormatCtx->streams[audioStream]->codec;
// Set audio settings from codec info

aCodec = avcodec_find_decoder(aCodecCtx->codec_id);

if (!aCodec) {
    fprintf (stderr, "Unsupported codec! \n");
    return -1;
}

avcodec_open (aCodecCtx, aCodec);

我现在如何解码音频并将其返回给 Java 程序?也许有人可以给我举个例子

编辑: 使用avcodec_decode_audio3时 获取以下信息: 03-22 07:54:00.988:信息/调试 (31):* *


使用音轨类来为您完成这项工作。你可以做这样的事情。

JAVA端。

            AudioTrack track;

            int bufSize = AudioTrack.getMinBufferSize(44100,                                AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                            AudioFormat.ENCODING_PCM_16BIT);


            track = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO, 
                        AudioFormat.ENCODING_PCM_16BIT, bufSize, AudioTrack.MODE_STREAM);

            track.play(); 

            while(true){
            readBufferFromNative(); //update buffer from native code

                    ....................
                    ....................
                    }

在本机端:您需要首先读取帧并将其转换为原始 pcm 格式,然后开始连续填充音频缓冲区。当缓冲区满时,会自动播放。

JNIEXPORT int JNICALL Java_com_ffmpeg_Main_jniMainEntry(JNIEnv* env, jobject obj, jstring input) {

    const char * pszFileName = (*env)->GetStringUTFChars(env, input, 0);
    AVFormatContext * m_fc;
    int err;
    AVPacket pkt;
    char * pAudioBuffer = (char *) av_malloc (AVCODEC_MAX_AUDIO_FRAME_SIZE * 2);
    int i;

    avcodec_register_all ();
    avdevice_register_all ();
    av_register_all ();

    err = av_open_input_file(&m_fc, pszFileName, 0, 0, 0);
    err = av_find_stream_info(m_fc);
    for(i = 0; i<m_fc->nb_streams; i++) {
    if((m_fc->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) || (m_fc->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)) {
    AVCodec *codec = avcodec_find_decoder(m_fc->streams[i]->codec->codec_id);

    if (codec == 0)
            continue;
    err = avcodec_open(m_fc->streams[i]->codec, codec);
    if (err <0)
            continue;
    }
 }
    while (av_read_frame(m_fc, &pkt)>= 0) {
            if (m_fc-> streams[pkt.stream_index]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
                    int data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE * 2;
                    int size=pkt->size;
                    while(size > 0) {
                            int len = avcodec_decode_audio3(m_fc->streams[pkt.stream_index]->codec, (int16_t *) pAudioBuffer, &data_size, &pkt);
                            LOGD("data_size %d len %d", data_size, len);
                            size = pkt->size-len;
                            }
            }
 }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Android中通过FFmpeg解码音频 的相关文章

  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • 强制用户在 Android 中的 EditText 中输入内容

    我的活动中有几个编辑文本 我希望我的用户在提交表单之前正确输入 我该怎么做 我还有旋转器和 RadioGroup 按钮 你可以加验证在提交按钮上单击 private boolean validateFields int yourDesire
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • FileNotFoundException:/存储/模拟/0/Android

    我尝试这个文件写入器 读取器代码段进行测试 File file new File Environment getExternalStorageDirectory LM lm lisdat 01 txt FileOutputStream ou
  • Youtube 退出全屏模式 TextView 可见性问题

    我正在全屏模式下播放视频 当我单击后退按钮时 我可以退出全屏模式 但无法显示我在全屏情况下隐藏的 TextView 要在全屏模式下隐藏 textView 我使用以下代码 Override public void onInitializati
  • 从 ffmpeg 获取实时输出以在进度条中使用(PyQt4,stdout)

    我已经查看了很多问题 但仍然无法完全弄清楚 我正在使用 PyQt 并且希望能够运行ffmpeg i file mp4 file avi并获取流式输出 以便我可以创建进度条 我看过这些问题 ffmpeg可以显示进度条吗 https stack
  • 如何以编程方式断开拨出呼叫

    我使用以下代码以编程方式断开呼叫 但它不起作用 private void callDisconnect try TelephonyManager manager TelephonyManager this getSystemService
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • 如何强制从本机代码打开 Android 软键盘?

    我有一个游戏 当用户触摸屏幕时 它使用从 C 到 Java 的回调来强制打开软键盘 Java代码很简单是这样的 this inputMethodManager toggleSoftInput InputMethodManager SHOW
  • finish() 完成活动但它仍然在后台

    我有一个关于 android studio 中活动的 finish 方法的问题 我有这个简单的代码 public class MainActivity extends AppCompatActivity Override protected
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • Android Studio - 值必须 ≥ 0

    我在 Android Studio 中收到与光标有关的错误 我的代码中有以下行 String data cursor getString cursor getColumnIndex columnIndex columnIndex 被传递到该
  • JavaDoc 在 Android 项目中不起作用

    我在 Ubuntu 10 04 上使用 Eclipse 3 5 2 进行 Android 开发 我安装了 来自 Ubuntu 存储库的 Sun JDK Eclipse 3 5 2 经典 来自 eclipse org 解压到 opt ecli
  • Vimeo 视频在 Android 6 设备上停止播放

    我正在尝试在我的应用程序中播放 Vimeo 的视频 问题是在 Android 6 设备上 视频会在一定时间后停止播放 在 API 较低的设备上一切正常 时间取决于质量 对于下面提供的网址的视频 播放一定分钟 1 到 3 视频质量有多低 播放
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 在Android Studio中更改项目主题?

    我使用浅色主题创建了一些项目 现在我想将其更改为深色 但我不知道该怎么做 顺便说一句 我不是问如何在代码中做到这一点 只是问如何更改项目的默认主题 在 AndroidManifest xml 的 application 标签下 您可以设置您
  • onBackPressed 隐藏 不破坏 Activity

    我知道如何取消后退按键 以便活动 主窗口保持可见 public void onBackPressed return 我的目标是隐藏该活动 但是 在没有完成它的情况下 您如何在 onBackPressed 事件中做到这一点 即我想达到 onP
  • NoClassDefFoundError:无法解析:Landroid/support/v7/appcompat/R$styleable

    新手尝试完成 Google 提供的我的第一个应用程序教程 在这个致命异常的过程中 我确实导入了很多随机包来消除许多事情的 无法解析 错误 例如 ActionBarActivity EditText Fragment LayoutInflat
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部

随机推荐

  • 如何将 jQuery 事件处理程序附加到 YouTube 电影?

    编辑 对那些已经回答的人表示抱歉 在我睡眠不足的状态下 我忘记了这种特殊情况是 YouTube 电影 而不是 JW FLV 播放器 我可以看到有更多关于与 YouTube 电影交互的文档 所以我会继续研究 但也欢迎提供更多信息 我正在使用
  • while 循环确定输入的值是否为 double

    我正在做一个相当大的项目 这只是包含在其中 基本上 我创建了一个获取员工信息的类 我们需要它 以便用户必须输入双倍的工资率 说 8 点 注意用户不能添加美元符号 例如 8 00 否则会提示用户发生错误 然而 当我测试运行代码时 代码没有使用
  • 如何格式化 Ansible 输出

    我想格式化 Ansible 输出 my local SUCCESS rc 0 gt gt 116G my local2 SUCCESS rc 0 gt gt 116G to my local gt gt 116G my local2 gt
  • 服务器如何因 chmod 777 而变得容易受到攻击?

    我经常读到类似这样的文章 chmod 777 很糟糕 我想知道 当我执行时我如何变得脆弱chmod 777在一个文件上 我可以重现的真实世界示例是什么 It 允许文件系统内容查看和 或修改由任何人 假设攻击者已经具有通用系统访问权限 这在共
  • 如何在Python中以指定位数的二进制字符串形式返回数字

    可能是一个愚蠢的问题 但是在 python 中是否有一种简单的方法可以自动用零将数字填充到固定长度 我在 python 文档中找不到这个 但我可能还不够努力 e i 我希望 bin 4 返回 00100 而不仅仅是 100 是否有一种简单的
  • 确定 WPF RichTextBox 中选定的 InlineUIContainer

    我想确定 WPF RichTextBox 中当前插入符位置是否存在 InlineUIContainer 或 BlockUIContainer 目前我有一个 RichTextBox 如下
  • Message内部逻辑

    我试图找出其中的逻辑Message行为 考虑评估以下内容 On Sin 1 1 评估完以上内容后 您将得到大约 830 Messages in 数学 7 所有这些Messages在生产过程中出现了 Sin argx Sin called w
  • 正则表达式 - 匹配后面没有特定模式的字符

    我想要一个正则表达式 尽可能高效 因为我使用 C 并且引擎效率不高 来匹配任何包含 且不立即跟随的字符串 1 一个字母 a zA Z or 2 NUMBERS a zA Z or 3 数字 a zA Z 所以我想匹配这样的字符串 dsfdf
  • C++ 中的 fseek 函数会刷新缓冲区中的数据吗?

    我们知道 调用 fprintf 或 fwrite 等函数不会立即将数据写入磁盘 而是会缓冲数据直到达到阈值 我的问题是 如果我调用 fseek 函数 这些缓冲数据会在查找新位置之前写入磁盘吗 或者数据仍在缓冲区中 并写入新位置 cheng
  • Qt中线程间通信的实现

    我在实现以下场景时遇到问题 我的问题陈述是这样的 我有 3 个线程 ThreadCamera 用于从相机中抓取帧 用于处理帧的 ThreadProcess 使用 OpenCV 对捕获的图像 帧进行一些图像处理 和用于显示图像的主 GUI 线
  • 如何将图像源设置为哈巴狗模板中的变量?

    在创建电影信息平台时 我想打印图像海报 我无法将图像的来源设置为 pug 中的变量 each movie in movies col md 3 style margin bottom 20px text center img src mov
  • 如何从浏览器意图获取授权令牌?

    抱歉我的英语不好 我会尽力尽可能简单地解释我的问题 我正在尝试制作一个与 Yandex API 配合使用的应用程序 在他们的帮助页面上 我读到您应该从用户登录的应用程序启动浏览器 然后通过注册 URI 回调返回到应用程序 我现在拥有的 Ov
  • Magento 错误:模块“Mage_Api”需要模块“Mage_Core”

    我的生产站点无缘无故地消失了 我知道我安装的最后一个扩展 但那是三天前的事了 我在每个页面上都收到此错误 a 4 i 0 s 46 Module Mage Api requires module Mage Core i 1 s 702 0
  • 有人可以帮助解释为什么不使用 SQL JOIN 是不好的做法和错误吗? [复制]

    这个问题在这里已经有答案了 可能的重复 显式与隐式 SQL 连接 SQL JOIN USING ON 或 WHERE 之间有区别吗 我正在检查由不太熟悉 SQL 的开发人员维护的代码 我在他的代码中经常看到如下片段 SELECT FROM
  • 找不到“System.IdentityModel.Tokens.UserNameSecurityToken”令牌类型的令牌身份验证器。

    我正在尝试让第三方 Java 客户端与我编写的 WCF 服务进行通信 收到消息时出现以下异常 无法找到令牌验证器 System IdentityModel Tokens UserNameSecurityToken 令牌类型 代币 根据当前的
  • Java修改map内的关键对象

    我在使用 JAVA 地图时遇到问题 我在地图中输入一个对象作为键 然后我修改了键 地图不再将该对象视为地图的键 即使对象内部的键已被相应修改 我正在处理该对象CoreLabel来自斯坦福自然语言处理 但我猜它适用于一般情况 Map
  • 如何显示直接从Figure类创建的matplotlib图形?

    如何显示不是使用 pyplot pylabfigure 创建而是直接从 matplotlib 的Figure 类构建的图形 import matplotlib as mpl figure mpl figure Figure figure s
  • Firefox 在 CORS 资源上失败,而 Chrome 和 Safari 可以工作

    我有一个看似正确的资源 由 CouchDB 安装支持 使用 JS Axios 发出请求 Chrome 和 Safari 都可以工作 Firefox 65 0 却失败了 CORS header Access Control Allow Ori
  • 语法错误:“无法分配给函数调用”

    这行 invest initial amount top company 5 year year 1 subsequent amount 产生错误 SyntaxError can t assign to function call 如何解决
  • 如何在Android中通过FFmpeg解码音频

    我正在使用为 Android NDK 编译的 FFmpeg 编写一个 Android 播放器 我可以通过 FFmpeg 打开该文件并写道 av register all char str env gt GetStringUTFChars e