Как генерировать несколько битрейта HLS-контента из живого потока RTSP?

12194
prashantas

Я получаю один битрейт в прямом эфире hls из живого потока rtsp. Я использую следующую команду

ffmpeg -v verbose -i rtsp://127.0.0.1:8080/test.sdp \ -vcodec libx264 -acodec aac -ac 1 -strict -2 -crf 18 -profile:v baseline \ -maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header \ -hls_time 10 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments \ -start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index1.m3u8 

Как я могу изменить приведенную выше команду ffmpg для генерации контента с несколькими битрейтами? Пожалуйста, помогите мне.

5

2 ответа на вопрос

5
vayvanne
ffmpeg -v verbose -i rtsp://127.0.0.1:8080/test.sdp \ -vcodec libx264 -acodec aac -ac 1 -strict -2 -crf 18 \ -profile:v baseline -maxrate 400k -bufsize 1835k \ -pix_fmt yuv420p -flags -global_header \ -hls_time 10 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments \ -start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index1.m3u8 \ -vcodec libx264 -acodec aac -ac 1 -strict -2 -crf 18 \ -profile:v baseline -maxrate 700k -bufsize 1835k \ -pix_fmt yuv420p -flags -global_header \ -hls_time 10 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments \ -start_number 1 /usr/local/apache-tomcat-7.0.53/webapps/ROOT/hls/index2.m3u8 

и создайте index.m3u8, указывающий на потоки выше:

#EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=400000 hls/index1.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=700000 hls/index2.m3u8 
Добро пожаловать в Супер пользователя. Можете ли вы расширить свой ответ, чтобы объяснить, что делает этот код и как он решает проблему? Необъяснимый код [обескуражен] (http://meta.stackexchange.com/questions/148272), потому что он не учит этому решению. Благодарю. fixer1234 8 лет назад 0
Мы добавляем второй вывод с теми же параметрами, что и первый, но -maxrate 700k, а затем создаем индекс мультибитрейта m3u8 для обоих потоков HLS. vayvanne 8 лет назад 0
2
rainabba

Концепция, которая вам нужна для генерации нескольких выходов из одного входа с помощью ffmpeg, очень четко продемонстрирована (по крайней мере, для меня так) на https://trac.ffmpeg.org/wiki/Creating%20multiple%20outputs

в основном, ffmpeg -i someinput [output_options] someoutput1 [output2_options] someoutput2это шаблон. Похоже, вы уже знаете, как использовать rtsp в качестве входных данных, и вы знаете, как генерировать один выход с заданным битрейтом. Вы также хотите повторить весь выходной блок (все после входной строки rtsp) и каждый раз менять разрешение -sи битрейт (вы используете -crf, так что вы хотите уменьшить его для более высокого разрешения / более высокого качества и увеличения это для более низкого разрешения, более низкого качества).

Лично я бы использовал crf для воспроизведения HLS, а с libx265 я использую правило, frame_width * frame_height * frame_rate * 0.1чтобы получить «идеальный» битрейт для данного размера кадра. вам нужно будет перевернуть уравнение, если вы хотите выбрать битрейт для цели, а затем выяснить размер кадра. Значение «.1» может возрасти, но в целом вы не увидите большой выгоды (более сложный контент лучше будет использовать более высокое значение), и я редко опускаюсь ниже 0,07.

Похожие вопросы