LinuxForum.Fans
Тема

ffmpeg не вставляет звук

Автор: Peter 24 сообщений 1951 просмотров
17.03.2017 13:54 #421470

Здравствуйте!

Есть Astra Linux 1.3 с пакетами из Debian Wheezy и deb-multimedia.
Я пытаюсь с помощью ffmpeg из deb-multimedia создать avi со звуком
и это не удаётся - звуковая дорожка создаётся и извлекается, но звука
в ней нет. В то же время звуковой файл в отдельности создаётся и звучит.
Вот как создаётся звуковой файл:

text

#!/bin/bash

fdt=`date +%Y_%m_%d_%H_%M_%S` fln="out" fle="mp2" flnm=${fln}.$fle

#ffmpeg -v verbose -t 10 -f jack -i cln1 -map 0 -f $fle -c:0:0 mp2 $flnm >& ${fln}.log & ffmpeg -v verbose -t 10 -f jack -i cln1 -map 0 -f $fle -c:a $fle $flnm >& ${fln}.log & jack_lsp -c > jack_lsp.out jack_connect system:capture_1 cln1:input_1 jack_connect system:capture_2 cln1:input_2

Вот
как создаётся avi:

text

#!/bin/bash

rm -f out.avi out_avi.log frm="avi" fps=20 fdt=`date +%Y_%m_%d_%H_%M_%S` #flnm="$HOME/hard5/avi/${fdt}_$fps.avi" #flnm="out.avi" flnm="${fdt}_${fps}.$frm"

#ffmpeg -v verbose -t 10 -f x11grab -s xga -r $fps -i ${DISPLAY}+0,0 -f jack -i cln1 -map 0 -map 1 -c:1:a mp2 -c:0:v libx264 -f avi $flnm >& out_avi.log & ffmpeg -v verbose -t 10 -f x11grab -s xga -r $fps -i ${DISPLAY}+0,0 -f jack -i cln1 -f $frm -map 0:v -map 1:a -c:1:a mp2 -c:0:v libx264 $flnm >& out_${frm}.log & #ffmpeg -v verbose -t 10 -f x11grab -s xga -r $fps -i ${DISPLAY}+0,0 -f jack -i cln1 -f $frm -map 0 -map 1 -c:0:v libx264 -c:1:a mp2 $flnm >& out_${frm}.log & #ffmpeg -v verbose -t 10 -f x11grab -s xga -r $fps -i ${DISPLAY}+0,0 -f jack -i cln1 -f $frm -map 0 -map 1 -c:0:0 libx264 -c:1:0 mp2 $flnm >& out_${frm}.log &

jack_lsp -c > jack_lsp.out jack_connect system:capture_1 cln1:input_1 jack_connect system:capture_2 cln1:input_2

Тут любой вариант вызова ffmpeg работает одинаково.

Вот как извлекается звуковой поток:

text

#!/bin/bash

fln=`echo $1 |cut -d "." -f 1` echo $fln

#rm -f ${fln}.mp2 #ffmpeg -v verbose -i $1 -map 0 -c:0:1 copy ${fln}.mp2 >& out.log rm -f $fln ffmpeg -v verbose -i $1 -map 0:1 -c copy -f mp2 $fln >& out.log

Параметр - имя avi-файла. Здесь тоже любой вариант вызова ffmpeg
работает одинаково.

Почему же ffmpeg не вставляет звук в avi, а только создаёт дорожку?
Отдельный звуковой файл ведь строится правильно.

Пётр.

17.03.2017 14:45 · отредактировано #421472
"Peter" написал:
Я пытаюсь

Peter, зачем же вы "пытаетесь" делать одно и то же в 3-х уже отдельных темах форума? ... про эти свои свистелки с перделками ...
Может ещё 10 тем заведём ... чтоб мало не казалось?

Вам недостаёт внимания в этой жизни? *STOP*

17.03.2017 16:43 #421473
Olej написал:
[quote="Peter"]Я пытаюсь

Peter, зачем же вы "пытаетесь" делать одно и то же в 3-х уже отдельных темах форума? ... про эти свои свистелки с перделками ...
Может ещё 10 тем заведём ... чтоб мало не казалось?

Вам недостаёт внимания в этой жизни? *STOP*[/quote]
Внимания мне если и недостаёт, то это не одно и то же, а другое,
поэтому я и завёл новую тему. Однако сегодня был один случай,
когда звук внедрился в avi, после того, как я оставил свой вопрос,
но больше он не повторялся. Наверное, это всё же чьи-то козни.

Но я надеялся получить здесь добрый совет, можно сказать,
опереться о плечо друга, а вместо этого меня здесь подвергают
остракизму.

Пётр.

17.03.2017 21:34 #421479

Хм, у меня такой командой создается норм:

text
ffmpeg -f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor -acodec mp2 -f x11grab -s xga -r 20 -i ${DISPLAY}+0,0 -vcodec h264 -q:v 0 out2.avi

И звук вместе с изображением захватывается.
Команда захвата у вас сумасшедшая, не говоря уже что названия декодера libx264 в ffmpeg нет - это h264.
Вам остается только заменить на свое устройство захвата звука, у вас это:

text
-f jack -i cln1

У меня это:

text
-f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor

Я же уже выкладывал скрипт захвата с в проектах пользователей тыц, там был уже готовый пример последовательность параметров и т.п. можно было посмотреть там. Вам оставалось только под свой кодек подстроить и систему вывода звука...

Правда там в скрипте используется по умолчанию mp4 а не avi.
А так лучше использовать мой вариант с кодированием в mpeg4, затем уже сконвертировать в avi, так как иначе длительность звуковой дорожки и видео может не соответствовать.

17.03.2017 23:17 · отредактировано #421481
"ormorph" написал:
Я же уже

Эх!
"Не вставляет"! *YAHOO*


Мне бы, пацаны, такие колёса, чтобы отъехать.
17.03.2017 23:40 · отредактировано #421482

ormorph, благодарю за совет, посмотрю и попробую. У меня USB звуковая карта.
Я предполагал, что надо расположить параметры в каком-то другом порядке, но не успел
установить, в каком. Вроде бы у меня сделано, как в "man ffmpeg". При этом в Astra 1.4
эта же команда, но с avconv, срабатывала всегда. А вчера и сегодня, в Astra 1.3, с ffmpeg,
сработала только один раз.
Вроде бы команда

text
ffmpeg -encoders

выводит libx264.

Пётр.

17.03.2017 23:54 #421484
"Peter" написал:
Вроде бы команда

ffmpeg -encoders

выводит libx264.

А ну да, я смотрел

text
ffmpeg -decoders

Хотя без разницы что пропишешь, и то и то работает, просто в зависимости от перестановок параметров у меня в некоторых случаях libx264 не срабатывала, выводило сообщение что нет такого декодера, а вот h264 работало, хотя файл получался закодирован одним и тем же кодеком, что и показывает команда:

text
ffmpeg -codecs
17.03.2017 23:55 #421485
"Peter" написал:
А вчера и сегодня, в Astra 1.3, с ffmpeg, сработала только один раз.

Русская рулетка *KISSED*

18.03.2017 12:07 #421512

ormorph, я заметил, что у вас не используется опция "-map", т.к. все опции
для очередного входного файла расположены сразу за ним, но у меня же нет ошибки
в выборе потока и кодека для него? Или есть?
В моём случае только один видеопоток и один аудиопоток, но в общем случае может
требоваться выбор потока.

Пётр.

18.03.2017 13:32 · отредактировано #421517
Peter написал:
ormorph, я заметил, что у вас не используется опция "-map", т.к. все опции
для очередного входного файла расположены сразу за ним, но у меня же нет ошибки
в выборе потока и кодека для него? Или есть?

Тыц читайте...
Так как у вас используется всего один поток видео и один поток аудио, то хватило бы -map 0:0 означает первый поток видео и первый поток аудио, можно и без этой опции...
Так как у вас идёт сначала map 0 потом map 1, то получается что у вас звуковой поток добавляется после видео потока, а не объединяется вместе с ним.

18.03.2017 14:33 · отредактировано #421531
ormorph написал:
[quote=Peter]ormorph, я заметил, что у вас не используется опция "-map", т.к. все опции
для очередного входного файла расположены сразу за ним, но у меня же нет ошибки
в выборе потока и кодека для него? Или есть?

Тыц читайте...
Так как у вас используется всего один поток видео и один поток аудио, то хватило бы -map 0:0 означает первый поток видео и первый поток аудио, можно и без этой опции...
Так как у вас идёт сначала map 0 потом map 1, то получается что у вас звуковой поток добавляется после видео потока, а не объединяется вместе с ним.[/quote]
Я из "man ffmpeg" понял так, что в "-map" 1-е число - это номер входного файла, 2-е - номер потока в этом файле,
там это прямо сказано.
[console]

-map [-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]] | [linklab 1024 el] (output)
Designate one or more input streams as a source for the output file. Each input s 1026 tream
is identified by the input file index input_file_id and the input stream index
input_stream_id within the input file. Both indices start at 0. If specified,
sync_file_id:stream_specifier sets which input stream is used as a presentation sync
reference.
[/console]

Пётр.

18.03.2017 15:16 · отредактировано #421549
Peter написал:

Я из "man ffmpeg" понял так, что в "-map" 1-е число - это номер входного файла, 2-е - номер потока в этом файле,
там это прямо сказано.

Значит я накололся и надо добавить -map 1:0 для звука.

18.03.2017 15:26 #421552
ormorph написал:
[quote=Peter]
Я из "man ffmpeg" понял так, что в "-map" 1-е число - это номер входного файла, 2-е - номер потока в этом файле,
там это прямо сказано.

Значит я накололся и надо добавить -map 1:0 для звука.[/quote]
Так в раскомментированной команде ffmpeg у меня так и есть: "-map 0:v" и "-map 1:a".
Это то же самое, что "-map 1:0", т.к. там только аудио, но я пробовал и так,
но во всех случаях одинаково не работает. Не помню, пробовал ли я менять порядок
"-map 0" и -map 1", но вроде бы он не должен влиять.
В понедельник попробую как у вас, без -map, в естественном порядке,
или же как сейчас, но в mpeg4.

Пётр.

18.03.2017 15:55 #421561
Peter написал:

Так в раскомментированной команде ffmpeg у меня так и есть: "-map 0:v" и "-map 1:a".
Это то же самое, что "-map 1:0", т.к. там только аудио, но я пробовал и так,
но во всех случаях одинаково не работает. Не помню, пробовал ли я менять порядок
"-map 0" и -map 1", но вроде бы он не должен влиять.
В понедельник попробую как у вас, без -map, в естественном порядке,
или же как сейчас, но в mpeg4.

Вечером позже доберусь до компа скажу как должно быть map.
А так по логике для выходного файла надо сделать преобразование типа:
-map 0:0 -map 1:0 -map 0:0 -map 0:1

18.03.2017 16:17 #421565
ormorph написал:
[quote=Peter]
Так в раскомментированной команде ffmpeg у меня так и есть: "-map 0:v" и "-map 1:a".
Это то же самое, что "-map 1:0", т.к. там только аудио, но я пробовал и так,
но во всех случаях одинаково не работает. Не помню, пробовал ли я менять порядок
"-map 0" и -map 1", но вроде бы он не должен влиять.
В понедельник попробую как у вас, без -map, в естественном порядке,
или же как сейчас, но в mpeg4.

Вечером позже доберусь до компа скажу как должно быть map.
А так по логике для выходного файла надо сделать преобразование типа:
-map 0:0 -map 1:0 -map 0:0 -map 0:1[/quote]
Возможно и надо, но в "man avconv" подобные конструкции применяются
при использовании -map_channel, а это не мой случай.
У вас же вообще без -map.

Пётр.

18.03.2017 18:11 #421569
"Peter" написал:
Так в раскомментированной команде ffmpeg у меня так и есть: "-map 0:v" и "-map 1:a".
Это то же самое, что "-map 1:0", т.к. там только аудио, но я пробовал и так,
но во всех случаях одинаково не работает. Не помню, пробовал ли я менять порядок
"-map 0" и -map 1", но вроде бы он не должен влиять.

Ну не знаю, попробовал сейчас на своем компе, что этот вариант работает:
[console]$ ffmpeg -f x11grab -s xga -r 20 -i ${DISPLAY}+0,0 -f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor -c:v mpeg4 -q:v 0 -acodec mp2 file.avi[/console]
что этот:
[console]ffmpeg -f x11grab -s xga -r 20 -i ${DISPLAY}+0,0 -f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor -map 0 -map 1 -c:v mpeg4 -q:v 0 -acodec mp2 file.avi[/console]
что этот:
[console]ffmpeg -f x11grab -s xga -r 20 -i ${DISPLAY}+0,0 -f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor -map 0:0 -map 1:0 -c:v mpeg4 -q:v 0 -acodec mp2 file.avi[/console]
Во всех случаях звук с видео объединяются, ваш вариант у меня тоже не работает...
Кодек выбрал mpeg4 так как libx264 видео идет немного дольше чем звук(не соответствует), по этому лучше потом файл конвертировать в сжатый формат libx264.

18.03.2017 20:50 #421574

ormorph, ещё раз благодарю, а что делает "-q:v 0" и почему без него нельзя?
В примерах в "man ffmpeg" это не встречается. Что такое 0? Из man я как-то не понял.

Пётр.

18.03.2017 21:15 #421576
"Peter" написал:
ormorph, ещё раз благодарю, а что делает "-q:v 0" и почему без него нельзя?

Этот параметр определяет наивысшее качество выходного видеофайла. Обычно это значения 1-31, где 31 - наименьшее качество. Этот параметр сокращенное -qscale:v
Просто в старых версиях ffmpeg для указания наивысшего качества использовался параметр -sameq, теперь его нет. Качество можно указывать через -qscale либо через -qmax.

18.03.2017 21:42 #421577
ormorph написал:
[quote="Peter"]ormorph, ещё раз благодарю, а что делает "-q:v 0" и почему без него нельзя?

Этот параметр определяет наивысшее качество выходного видеофайла. Обычно это значения 1-31, где 31 - наименьшее качество. Этот параметр сокращенное -qscale:v
Просто в старых версиях ffmpeg для указания наивысшего качества использовался параметр -sameq, теперь его нет. Качество можно указывать через -qscale либо через -qmax.[/quote]
ormorph, хорошо, посмотрю, что будет с mpeg4 и с "-q:v q".
Но всё равно я не понял, почему не работает ни один из моих вариантов, там есть вроде бы такой же,
как ваш в средней строке, только без "-q:v 0". Не может ли мешать то, что у меня тип выходного файла
указывается через ещё один "-f "? Или это "-f" должен быть непосредственно перед именем выходного
файла?

Пётр.

18.03.2017 22:14 · отредактировано #421578
"Peter" написал:
Но всё равно я не понял, почему не работает ни один из моих вариантов, там есть вроде бы такой же,

Кто же его знает, разбираться уже лень)
А так в рамках телепатии параметр -c:1:a, не знаю влияет ли порядок, но в примере мана сначала идет -c: затем идентификатор типа кодека -c:a, а затем уж только номер потока -c:a:1. Так как источник звука содержит только один звуковой поток, то по идее этот параметр должен быть -c:a:0 а не -c:a:1. Ну и порядок лучше сохранять, так как сначала идет источник видео, затем источник звука в таком же порядке идут -map, то в таком же порядке объявлять типы кодеков.

Войдите или зарегистрируйтесь, чтобы ответить.