[Разработка Android FFMPEG] Используйте FFMPEG в Android для преобразования аудиосэмплов PCM в формат MP3.
[Разработка Android FFMPEG] Используйте FFMPEG в Android для преобразования аудиосэмплов PCM в формат MP3.

Каталог статей

1. Предоперационная подготовка (пересадка FFMPEG)


ссылка 【Android FFMPEG Разработка】Android казнен в FFMPEG инструкция блог ;

Импортируйте следующие зависимости в сценарий сборки build.gradle приложения;

Язык кода:javascript
копировать
dependencies {
	implementation 'com.writingminds:FFmpegAndroid:0.3.2'
}

тогда следуй 【Android FFMPEG Разработка】Android казнен в FFMPEG инструкция 2. Андроид казнен в FFMPEG инструкция Разработать процесс в ,Будет сращено FFMPEG инструкциявходящий ffmpeg.execute метод ;

2. Команда FFMPEG для преобразования семплов PCM в формат MP3.


Команда FFMPEG для преобразования семплов PCM в формат MP3:

Язык кода:javascript
копировать
ffmpeg -y -f Формат выборки -ac Количество каналов -ar Частота выборки -acodec pcm_s16le -i PCMисточникдокумент Целевой документ MP3

-y: указывает, что перезапись разрешена;

-f: указывает формат файла, обычно s16le, где s указывает, что образец представляет собой целое число со знаком, 16 указывает, что это 16-битный образец.

2 байта, l представляет формат с прямым порядком байтов, если он равен b, он представляет формат с прямым порядком байтов, s16le представляет формат беззнакового 16-битного целого числа с прямым порядком байтов;

-ac: количество каналов, настройка моно

1, стереонастройка 2;

-ar: частота дискретизации, 48000 означает частоту дискретизации 48000 Гц;

-acodec: указать кодировщик;

-i: указать исходный файл;

Наконец, есть путь к преобразованному файлу MP3;

Полная команда в Android:

Язык кода:javascript
копировать
ffmpeg -y -f s16be -ac 2 -ar 48000 -acodec pcm_s16le -i /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.pcm /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.mp3

PCM форматировать файл : /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.pcm

MP3 форматировать файл : /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.mp3

Преобразовать файл /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.pcm в файл /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.mp3;

-y : Разрешить переопределение ;

-f s16be : PCM Формат образца: 16 битовое беззнаковое целое число , хранилище в формате с прямым порядком байтов ;

-ac 2 : PCM Сэмплы в стерео ;

-ar 48000 : PCM Частота дискретизации выборки 48000 ;

-i /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.pcm : Входной файл /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.pcm ;

Выходной файл /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.mp3

Комментарии командной строки:

Язык кода:javascript
копировать
ffmpeg // Исполняемый документ
-y // Разрешить переопределение
-f s16be // PCM Формат образца: 16 битовое беззнаковое целое число , хранилище в формате с прямым порядком байтов
-ac 2 // стерео
-ar 48000 // 48000 Hz Частота выборки
-acodec pcm_s16le // Укажите кодировщик
-i /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.pcm // входить PCM документ
/data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.mp3 // выход MP3 документ

3. Полный пример исходного кода микширования Android FFMPEG.


Полный пример исходного кода микширования Android FFMPEG:

Язык кода:javascript
копировать
package com.example.ffmpeg_pcm_2_mp3

import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.github.hiteshsondhi88.libffmpeg.ExecuteBinaryResponseHandler
import com.github.hiteshsondhi88.libffmpeg.FFmpeg
import com.github.hiteshsondhi88.libffmpeg.LoadBinaryResponseHandler
import java.io.File

class MainActivity : AppCompatActivity() {
    val TAG = "MainActivity"

    /**
     * Под встроенным хранилищем приложения files Оглавление
     */
    lateinit var mFilePath: String

    lateinit var ffmpeg: FFmpeg

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mFilePath = this.filesDir.toString()

        // инициализация FFMPEG
        ffmpeg = FFmpeg.getInstance(this)

        // нагрузка FFMPEG Исполняемый документ
        ffmpeg.loadBinary(LoadBinaryResponseHandler())
    }

    /**
     * копироватьдокумент     */
    fun copy(view: View) {
        // Воля assets в audio.pcm Копировать во встроенное хранилище
        CommandUtils.copyAssets2File(
            this,
            "audio.pcm",
            "${mFilePath}/audio.pcm")

        showText()
    }

    /**
     * Выполнить команду смешивания
     */
    fun mix(view: View) {
        var cmd = "-y -f s16be -ac 2 -ar 48000 -acodec pcm_s16le -i ${mFilePath}/audio.pcm ${mFilePath}/audio.mp3"

        Log.i(TAG, «Выполнить команду : $cmd")

        var cmdArraay = cmd.split(" ").toTypedArray();
        ffmpeg.execute(cmdArraay, object : ExecuteBinaryResponseHandler(){
            override fun onStart() {
                super.onStart()
                Log.i(TAG, "onStart")
            }

            override fun onFinish() {
                super.onFinish()
                Log.i(TAG, "onStart")
                showText()
            }

            override fun onSuccess(message: String?) {
                super.onSuccess(message)
                Log.i(TAG, "onSuccess : $message")
            }

            override fun onProgress(message: String?) {
                super.onProgress(message)
                Log.i(TAG, "onProgress : $message")
            }

            override fun onFailure(message: String?) {
                super.onFailure(message)
                Log.i(TAG, "onFailure : $message")
            }
        })
    }

    /**
     * Показать встроенное хранилище Оглавление
     */
    fun showText(){
        var fileString = ""
        var files = File(mFilePath).listFiles()
        files.forEach {
            fileString += "${it}\n"
        }
        findViewById<TextView>(R.id.text).text = fileString
    }
}

Результат выполнения : Это правильный результат преобразования формата ;

Язык кода:javascript
копировать
2021-06-03 21:08:16.827 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: выполнить команду : -y -f s16be -ac 2 -ar 48000 -acodec pcm_s16le -i /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.pcm /data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.mp3
2021-06-03 21:08:16.841 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onStart
2021-06-03 21:08:16.853 4081-4164/com.example.ffmpeg_pcm_2_mp3 D/FFmpeg: Running publishing updates method
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress : ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   built with gcc 4.8 (GCC)
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   configuration: --target-os=linux --cross-prefix=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/vagrant/SourceCode/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/vagrant/SourceCode/ffmpeg-android/build/armeabi-v7a --extra-cflags='-I/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all' --extra-ldflags='-L/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   libavutil      55. 17.103 / 55. 17.103
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   libavcodec     57. 24.102 / 57. 24.102
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   libavformat    57. 25.100 / 57. 25.100
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   libavdevice    57.  0.101 / 57.  0.101
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   libavfilter     6. 31.100 /  6. 31.100
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   libswscale      4.  0.100 /  4.  0.100
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   libswresample   2.  0.101 /  2.  0.101
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   libpostproc    54.  0.100 / 54.  0.100
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress : [s16be @ 0xea1a7000] Estimating duration from bitrate, this may be inaccurate
2021-06-03 21:08:16.867 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress : Guessed Channel Layout for  Input Stream #0.0 : stereo
2021-06-03 21:08:16.868 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress : Input #0, s16be, from '/data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.pcm':
2021-06-03 21:08:16.868 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   Duration: 00:00:06.41, bitrate: 1536 kb/s
2021-06-03 21:08:16.868 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :     Stream #0:0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
2021-06-03 21:08:16.878 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress : Output #0, mp3, to '/data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.mp3':
2021-06-03 21:08:16.878 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   Metadata:
2021-06-03 21:08:16.878 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :     TSSE            : Lavf57.25.100
2021-06-03 21:08:16.878 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :     Stream #0:0: Audio: mp3 (libmp3lame), 48000 Hz, stereo, s16p
2021-06-03 21:08:16.878 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :     Metadata:
2021-06-03 21:08:16.878 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :       encoder         : Lavc57.24.102 libmp3lame
2021-06-03 21:08:16.878 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress : Stream mapping:
2021-06-03 21:08:16.878 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress :   Stream #0:0 -> #0:0 (pcm_s16le (native) -> mp3 (libmp3lame))
2021-06-03 21:08:16.878 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress : Press [q] to stop, [?] for help
2021-06-03 21:08:17.381 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress : size=      81kB time=00:00:05.16 bitrate= 128.9kbits/s speed=10.3x    
2021-06-03 21:08:17.494 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress : size=     101kB time=00:00:06.40 bitrate= 128.8kbits/s speed=10.4x    
2021-06-03 21:08:17.494 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onProgress : video:0kB audio:100kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.230294%
2021-06-03 21:08:17.498 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onSuccess : ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
      built with gcc 4.8 (GCC)
      configuration: --target-os=linux --cross-prefix=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/vagrant/SourceCode/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/vagrant/SourceCode/ffmpeg-android/build/armeabi-v7a --extra-cflags='-I/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all' --extra-ldflags='-L/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
      libavutil      55. 17.103 / 55. 17.103
      libavcodec     57. 24.102 / 57. 24.102
      libavformat    57. 25.100 / 57. 25.100
      libavdevice    57.  0.101 / 57.  0.101
      libavfilter     6. 31.100 /  6. 31.100
      libswscale      4.  0.100 /  4.  0.100
      libswresample   2.  0.101 /  2.  0.101
      libpostproc    54.  0.100 / 54.  0.100
    [s16be @ 0xea1a7000] Estimating duration from bitrate, this may be inaccurate
    Guessed Channel Layout for  Input Stream #0.0 : stereo
    Input #0, s16be, from '/data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.pcm':
      Duration: 00:00:06.41, bitrate: 1536 kb/s
        Stream #0:0: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
    Output #0, mp3, to '/data/user/0/com.example.ffmpeg_pcm_2_mp3/files/audio.mp3':
      Metadata:
        TSSE            : Lavf57.25.100
        Stream #0:0: Audio: mp3 (libmp3lame), 48000 Hz, stereo, s16p
        Metadata:
          encoder         : Lavc57.24.102 libmp3lame
    Stream mapping:
      Stream #0:0 -> #0:0 (pcm_s16le (native) -> mp3 (libmp3lame))
    Press [q] to stop, [?] for help
    size=      81kB time=00:00:05.16 bitrate= 128.9kbits/s speed=10.3x    
    size=     101kB time=00:00:06.40 bitrate= 128.8kbits/s speed=10.4x    
    video:0kB audio:100kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.230294%
2021-06-03 21:08:17.498 4081-4081/com.example.ffmpeg_pcm_2_mp3 I/MainActivity: onStart

Содержимое файла : ffmpeg это исполняемый файл , audio.pcm да PCM форматировать исходный файл , audio.mp3 да конвертирован mp3 документ ;

4. Исходный код блога


блог Исходный код :

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose