Làm thế nào để nói khập khiễng viết tiêu đề VBR để truyền phát?


1

Tôi muốn sử dụng lame để mã hóa các tập tin mp3, nhưng thay vì viết nó trực tiếp vào một tập tin, tôi muốn đưa nó vào một chương trình khác mà cuối cùng sẽ ghi nó ra một nơi nào đó. Vấn đề là nếu què phát hiện ra rằng đầu ra của nó là một luồng thì nó không ghi tiêu đề VBR và người chơi tìm ra độ dài của tệp sai. Ví dụ: nếu tôi làm điều này, thì tệp kết quả sẽ sai:

lame infile.wav - >outfile.mp3

Tôi đã thử mẹo sau:

lame infile.wav /dev/stdout >outfile.mp3

Nó dường như hoạt động lúc đầu, nhưng chỉ khi thiết bị xuất chuẩn được chuyển hướng trực tiếp đến một tệp. Trường hợp sau không hoạt động:

lame infile.wav /dev/stdout | cat >outfile.mp3

Nếu tôi sử dụng ffmpeg (hoặc avconv) làm mặt trước để khập khiễng, tôi đã gặp chính xác vấn đề tương tự.

Có cách nào để nói khập khiễng rằng tôi muốn nó viết tiêu đề VBR ngay cả khi nó nghĩ rằng nó đang ghi vào một luồng?

Câu trả lời:


1

Có vẻ như nó không thể được thực hiện theo cách này. Vấn đề là tiêu đề VBR được ghi vào đầu tệp, nhưng chỉ được tính ở cuối mã hóa. Điều này đòi hỏi phải tìm kiếm trong tệp, điều này là không thể nếu đầu ra là một đường ống.

Tôi đã chạy một stracetrên tất cả các biến thể ở trên. Trong phiên bản thứ 2 (khi ghi vào một tệp bình thường), tôi nhận được phần sau:

lseek(4, 0, SEEK_SET)                   = 0
write(4, "\377\373\220d\0\0\0"..., 417) = 417
close(4)                                = 0

Trong phiên bản đầu tiên, nơi tôi sử dụng -làm đối số đầu ra, què thậm chí không thử viết tiêu đề. Tuy nhiên, trong phiên bản thứ 3, nó đã thử nhưng không thành công vì đầu ra là một đường ống.

lseek(4, 0, SEEK_SET)                   = -1 ESPIPE (Illegal seek)

Nó cũng viết một thông báo lỗi ở cuối, dễ bị bỏ qua vì đầu ra khác mà nó thường in ra stderr, trừ khi tôi chạy nó với --silenttùy chọn (mà tôi đã làm, để làm sạch đầu ra strace):

fatal error: can't update LAME-tag frame!

Giải pháp cho vấn đề này là ghi vào một tệp tạm thời, sau đó chuyển tiếp hoặc sử dụng mã hóa bitrate không đổi (trong trường hợp đó không có tiêu đề bổ sung nào được ghi vào lúc đặt tệp sau khi mã hóa).


Cảm ơn thông tin này, sau tất cả những năm này =)
Niloct
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.