Вопрос или проблема
Я стримлю с источника mp4 и пока что мне удалось сохранить клипы в формате ogg (видео: libtheora, аудио: flac), но я хотел бы сохранить их в формате WebM. К сожалению, WebM требует libvorbis для аудио, и когда я пытаюсь сделать это:
$ ffmpeg -t 60 -rtsp_transport udp -i rtsp://192.168.1.142/video.mp4 -vcodec libvpx -acodec libvorbis -f webm test.webm
ffmpeg version 0.10.5 Copyright (c) 2000-2012 the FFmpeg developers
built on Oct 4 2012 19:17:43 with gcc 4.7.2 20120921 (Red Hat 4.7.2-2)
configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --extra-cflags="-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic" --enable-bzlib --disable-crystalhd --enable-gnutls --enable-libass --enable-libcdio --enable-libcelt --enable-libdc1394 --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopenjpeg --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab --enable-avfilter --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
libavutil 51. 35.100 / 51. 35.100
libavcodec 53. 61.100 / 53. 61.100
libavformat 53. 32.100 / 53. 32.100
libavdevice 53. 4.100 / 53. 4.100
libavfilter 2. 61.100 / 2. 61.100
libswscale 2. 1.100 / 2. 1.100
libswresample 0. 6.100 / 0. 6.100
libpostproc 52. 0.100 / 52. 0.100
[rtsp @ 0xc62ec0] Оценка продолжительности по битрейту, это может быть неточно
Input #0, rtsp, from 'rtsp://192.168.1.142/video.mp4':
Metadata:
title : QStream
comment : QStreaming Media
Duration: N/A, start: 0.000000, bitrate: N/A
Stream #0:0: Video: mpeg4 (Simple Profile), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 30 fps, 30 tbr, 90k tbn, 30 tbc
Stream #0:1: Audio: pcm_mulaw, 8000 Hz, 1 channels, s16, 64 kb/s
Файл 'test.webm' уже существует. Перезаписать? [y/N] y
w:640 h:480 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
[libvpx @ 0xc60b60] v1.0.0
[libvorbis @ 0xc61da0] Невозможно установить CBR на 128000: не поддерживается
[libvorbis @ 0xc61da0] oggvorbis_encode_init не удался
Output #0, webm, to 'test.webm':
Metadata:
title : QStream
comment : QStreaming Media
Stream #0:0: Video: vp8, yuv420p, 640x480 [SAR 1:1 DAR 4:3], q=-1--1, 200 kb/s, 90k tbn, 30 tbc
Stream #0:1: Audio: vorbis, 8000 Hz, 1 channels, s16, 128 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (mpeg4 -> libvpx)
Stream #0:1 -> #0:1 (pcm_mulaw -> libvorbis)
Ошибка при открытии кодировщика для выходного потока #0:1 - возможно, неверные параметры, такие как bit_rate, rate, width или height
Единственный способ, который я нашел для кодирования аудио в WebM-файл с помощью ffmpeg
, это здесь, но это требует два прохода, поэтому я не могу сделать это с живым стримом. Есть какие-то идеи?
Возможно, стоит рассмотреть возможность использования без аудио с помощью опции “-an”?
Ответ или решение
Вопрос о записи трансляции в формате WebM с использованием FFmpeg является актуальным и заслуживает внимательного рассмотрения. В данном ответе мы постараемся разложить проблему по полочкам, учитывая детали из описания проблемы, и предложить возможные решения.
Описание проблемы
Исходя из предоставленной информации, вы пытаетесь записывать живую трансляцию из источника MP4 и сохранить её в формате WebM. На текущий момент у вас успешно получается сохранять клипы в формате OGG, используя кодеки libtheora
для видео и flac
для аудио. Однако форматы WebM требуют использования libvorbis
для аудиодорожки. При попытке использовать команду ffmpeg
для записи в формате WebM появляется ошибка:
[libvorbis @ 0xc61da0] Unable to set CBR to 128000: not supported
[libvorbis @ 0xc61da0] oggvorbis_encode_init failed
Это указывает на проблемы с параметрами кодирования аудио, применяемыми к вашему стриму, что приводит к сбоям при инициализации кодека.
Возможные причины проблемы
-
Неподдерживаемый аудиоформат: Ваш исходный поток использует аудиоформат
pcm_mulaw
, который не поддерживается кодекомlibvorbis
. Для успешной кодировки вам необходимо использовать неподдерживаемый формат, такой какpcm_s16le
илиaac
. -
Неправильные параметры кодирования: Ошибка, указывающая на проблемы с параметрами кодека, может свидетельствовать о том, что передаваемые битрейты или частота дискретизации не соответствуют возможностям
libvorbis
. -
Версия FFmpeg: Используемая вами версия FFmpeg (0.10.5) устарела. Это может стать причиной непредсказуемого поведения из-за ограниченной поддержки современных кодеков и функций. Рекомендую обновиться до последней стабильной версии.
Возможные решения
-
Изменение формата аудио:
Попробуйте явным образом изменить формат аудио до передачи наlibvorbis
. Ваша команда может выглядеть следующим образом:ffmpeg -t 60 -rtsp_transport udp -i rtsp://192.168.1.142/video.mp4 -vcodec libvpx -acodec libvorbis -ar 48000 -b:a 160k -f webm test.webm
Здесь добавлены параметры
-ar 48000
(частота дискретизации 48 кГц) и-b:a 160k
(битрейт 160 кбит/с) для улучшения совместимости. -
Запись без аудио:
Если вам не критично наличие звука, вы можете отключить аудиопоток, добавив опцию-an
:ffmpeg -t 60 -rtsp_transport udp -i rtsp://192.168.1.142/video.mp4 -vcodec libvpx -an -f webm test.webm
-
Обновление FFmpeg:
Рассмотрите возможность обновления FFmpeg до последней версии. Современные версии программы содержат исправления и улучшения, которые могут помочь решить проблемы с кодированием. -
Конвертация до потока:
Если необходимо сохранить и аудио, можно использовать промежуточный файл:ffmpeg -t 60 -rtsp_transport udp -i rtsp://192.168.1.142/video.mp4 -vcodec libvpx -acodec pcm_s16le -f nut temp.nut ffmpeg -i temp.nut -c:v copy -c:a libvorbis -f webm test.webm
Это не является идеальным способом, однако может помочь до тех пор, пока не будет найдены более эффективные решения.
Заключение
Проблема записи потока в формате WebM с использованием FFmpeg может быть решена несколькими способами, начиная с корректировки параметров кодирования исходных аудиодорожек и заканчивая обновлением используемого программного обеспечения. Выбор подхода зависит от ваших конкретных нужд и доступных ресурсов. Надеюсь, эти рекомендации помогут вам добиться желаемого результата.