5

Я получаю один битрейт в прямом эфире 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 для генерации контента с несколькими битрейтами? Пожалуйста, помогите мне.

2 ответа2

5
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
3

Концепция, которая вам нужна для генерации нескольких выходов из одного входа с помощью 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .