ffmpeg: Xuất mpegts với một chương trình duy nhất chứa 1 âm thanh và 3 video


2

Tôi đang cố gắng tạo một máy chủ HLS / DASH mô phỏng trực tiếp bằng cách sử dụng chuỗi tương đương sau:

tsplay -loop multi_resolution.ts | shaka_packager | nginx

Vấn đề là tạo tệp "multi_resolution.ts": Nó cần chứa một chương trình duy nhất với 1 âm thanh và 3 video PID, mỗi tệp cho 720p, 480p và 360p. Tại sao? Bởi vì đó là cách shaka_packager cần.

Tôi nghĩ rằng tôi đang bối rối bởi cách ánh xạ các luồng được chuyển mã vào tệp đầu ra. Ở đây, lệnh không hoạt động mà tôi đã đấu tranh với:

ffmpeg -i "big_buck_bunny_1080p.mov" -threads 16 \
    -c:a aac -ac 2 -b:a:0 128k \
    -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \
        -vsync cfr -x264-params "nal-hrd=cbr" \
        -b:v:1 5000k -minrate 2000k -maxrate 2000k -bufsize 4000k -g 30 -s 1280x720 \
    -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \
        -vsync cfr -x264-params "nal-hrd=cbr" \
        -b:v:2 1500k -minrate 1000k -maxrate 1000k -bufsize 2000k -g 30 -s 854x480 \
    -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \
        -vsync cfr -x264-params "nal-hrd=cbr" \
        -b:v:3 500k -minrate 500k -maxrate 500k -bufsize 1000k -g 30 -s 640x360 \
    -program program_num=1:title=multi_p30:st=0:st=1:st=2:st=3 \
    -f mpegts "big_buck_bunny_720_480_360.ts"

Tôi đã thử nghiệm từng mã hóa trong sự cô lập, và chúng có vẻ tốt. Tôi nghi ngờ vấn đề là với quản lý / ánh xạ luồng của tôi.

Cứu giúp?

Câu trả lời:


2

Để chèn nhiều luồng vào một đầu ra, mỗi luồng đầu vào cần được ánh xạ rõ ràng. Các tùy chọn mã hóa, tự chúng, không tạo ra một sự phân công luồng trong đầu ra. Có vấn đề về lựa chọn luồng tự động, không áp dụng ở đây, nhưng bạn có thể đọc về nó tại https://ffmpeg.org/ffmpeg.html#Stream-selection

Vì thế,

ffmpeg -i "big_buck_bunny_1080p.mov" -threads 16 \
    -map 0:a -map 0:v -map 0:v -map 0:v \
    -c:a aac -ac 2 -b:a 128k \
    -s:v:0 1280x720 -s:v:1 854x480-s:v:2 640x360 \
    -g 30 -c:v libx264 -pix_fmt yuv420p -profile:v high -level 4.0 -preset veryslow -tune film \
    -vsync cfr -x264-params "nal-hrd=cbr" \
    -b:v:0 5000k -minrate:v:0 2000k -maxrate:v:0 2000k -bufsize:v:0 4000k \
    -b:v:1 1500k -minrate:v:1 1000k -maxrate:v:1 1000k -bufsize:v:1 2000k \
    -b:v:2 500k -minrate:v:2 500k -maxrate:v:2 500k -bufsize:v:2 1000k \
    -program program_num=1:title=multi_p30:st=0:st=1:st=2:st=3 \
    -f mpegts "big_buck_bunny_720_480_360.ts"

Ah, vì vậy tôi tạo ánh xạ khi bắt đầu , sau đó phủ nó với nội dung khác nhau. Tuy nhiên, tôi vẫn cần thực hiện 3 mã hóa cho các độ phân giải khác nhau, không chỉ các tốc độ bit khác nhau. và ": n" của tôi đi sau -c: v, không phải -b: v, phải không?
BobC

kích thước, codec, bitrate đều là các tùy chọn trên mỗi luồng, vì vậy, đối với mỗi luồng đầu ra, tùy chọn này phải được đặt bằng khóa-option:stream_type:index
Gyan

Tôi lại bị lẫn lộn: Hãy nói rằng tôi muốn thêm một lớp phủ văn bản. Tôi có thể áp dụng nó cho luồng video duy nhất trước khi ánh xạ để mỗi mã hóa 3 đầu ra tiếp theo sẽ chứa nó không? Hoặc phải áp dụng cho từng luồng trong 3 luồng video sau khi ánh xạ?
BobC

-vflà viết tắt của -filter:vmột vì vậy một -vfhoặc một -filter:vđối số sẽ được áp dụng cho tất cả các luồng video đầu ra. Nếu bạn muốn áp dụng một biểu thức lớp phủ khác nhau cho mỗi luồng, thì bạn sẽ thêm -filter:v:0 filters0 -filter:v:1 filters1-filter:v:2 filters2. Trong một tệp đầu ra duy nhất, thứ tự các tùy chọn không quan trọng, do đó các bản đồ có thể đến trước hoặc sau các bộ lọc hoặc bitrate.
Gyan

Ngoài ra, hãy xem câu trả lời của tôi cho superuser.com/q/1219784/114058
Gyan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.