Как извлечь аудио из видео с помощью ffmpeg на С++?

Я разрабатываю приложение на С++, которое использует FFmpeg для воспроизведения аудио/видео. Теперь я хочу улучшить приложение, чтобы пользователи могли извлекать аудио из видео. Как можно использовать FFmpeg для этого? Я много искал об этом, но я не смог найти учебник по этому поводу.


person patrick    schedule 10.06.2015    source источник
comment
Этот вопрос слишком общий. Либо слишком много возможных ответов, либо хорошие ответы будут слишком длинными для этого формата. Пожалуйста, добавьте детали, чтобы сузить набор ответов или выделить проблему, на которую можно ответить в нескольких абзацах.   -  person Jørgen R    schedule 10.06.2015
comment
в основном моя проблема заключается в том, как использовать ffmpeg lib для извлечения аудио из видео в c/c++   -  person patrick    schedule 10.06.2015
comment
См. официальный пример filtering_audio. Он передает звуковые кадры (после некоторой фильтрации) на stdout. При желании эти фитеры довольно легко отключить.   -  person Alex Cohn    schedule 04.06.2020


Ответы (2)


Тебе следует

  1. Откройте контекст ввода [ avformat_open_input ]
  2. Получить информацию о потоке [ avformat_find_stream_info ]
  3. Получить аудиопоток:
if (inputFormatContext->streams[index]->codec->codec_type ==
    AVMEDIA_TYPE_AUDIO) {
  inputAudioStream = inputFormatContext->streams[index];
}
  1. Прочитайте каждый пакет. пакет AVPacket;
int ret = av_read_frame(inputFormatContext, &packet);
if (ret == 0) {
  if (packet.stream_index == inputAudioStream->index) {
    // packet.data will have encoded audio data.
  }
}
person user2331977    schedule 10.06.2015
comment
Вы можете сохранить в любом формате контейнера. Откройте контекст формата вывода, используя avformat_alloc_output(), откройте файл в режиме записи avio_open, запишите заголовок, используя avformat_write_header(), запишите данные, используя av_interleaved_write_frame, и запишите хвост, используя av_write_trailer. Вы также можете обратиться к ffmpeg/muxing.c. - person user2331977; 11.06.2015
comment
я пытался использовать указанную выше ссылку, но строка avformat_alloc_output_context2(&oc, NULL, NULL, имя файла); выдает ошибку неопределенной ссылки на avformat_alloc_output_context2 - person patrick; 11.06.2015
comment
можете ли вы написать псевдокод, чтобы я мог написать правильный код C - person patrick; 11.06.2015
comment
Вы могли бы просто иметь небольшой полный пример, чтобы всем было намного легче следовать. - person Ayxan Haqverdili; 04.06.2020

Это похоже на простую задачу написания сценария... почему вы хотите использовать тяжелую артиллерию (C/C++), чтобы прихлопнуть муху?

Я использую Applescript для создания/запуска командной строки ffmpeg через оболочку Bash. Единственная причина, по которой я использую Applescript, заключается в том, что я могу вызывать его как дроплет (т. е. перетаскивать файлы в приложение и запускать его без взаимодействия).

Я понимаю, что вы, вероятно, работаете в Windows, то есть без Applescript и без Bash. Но, конечно, что-то более легкое, чем C, может создать/запустить командную строку ffmpeg. Это действительно так же просто, как:

ffmpeg -i infile.mp4 -b 160k outfile.mp3
person Roger Krueger    schedule 10.06.2015
comment
Я делаю это, чтобы создать собственный код для своего приложения для Android. - person patrick; 10.06.2015
comment
ОП указал, что они делают приложение на С++. Этот ответ вообще бесполезен. - person Ayxan Haqverdili; 04.06.2020