2013-07-29 39 views
8

Tôi đã thử googling một cách để đặt ngôn ngữ của luồng phụ đề bằng ffmpeg và tìm tùy chọn -slang. Vì vậy, tôi đã thử các lệnh sau nhưng ngay lập tức nhận được một lỗi:Đặt ngôn ngữ phụ đề bằng cách sử dụng ffmpeg

ffmpeg -i input.avi -i subs.srt -c:a copy -c:s mov_text -slang eng -c:v libx264 -profile:v high -level:v 4.0 output.mp4 
ffmpeg version 1.1 Copyright (c) 2000-2013 the FFmpeg developers 
built on Jul 18 2013 23:00:53 with Apple clang version 4.0 (tags/Apple/clang-421.0.60) (based on LLVM 3.1svn) 

libavutil 52. 13.100/52. 13.100

libavcodec 54. 86.100/54. 86.100

libavformat 54. 59.106/54. 59.106

libavdevice 54. 3.102/54. 3.102

libavfilter 3. 32.100/3. 32.100

libswscale 2. 1.103/2. 1.103

libswresample 0. 17.102/0. 17.102

libpostproc 52. 2.100/52. 2.100

Unrecognized option 'slang'.

Error splitting the argument list: Option not found

Sau hơn googling tôi tìm thấy một cách khác để làm điều đó bằng cách sử dụng lệnh -metadata:

ffmpeg -i input.mp4 -i subs.srt -c:a copy -c:v copy -c:s mov_text -metadata:s:s:0 language=eng output.mp4 

Và làm việc hoàn toàn tốt . Nhưng điều này không được đề cập trong trang người dùng ffmpeg, trong khi -slang là, điều đó làm cho tôi nghĩ rằng lệnh -metadata có lẽ đã lỗi thời hoặc theo một cách khác không tốt bằng -slang.

  1. Sự khác biệt giữa việc sử dụng hai phương pháp trên (-slang vs -metadata) là gì?
  2. Tại sao lệnh -slang của tôi đưa ra lỗi? Tôi đã sử dụng nó không chính xác?
+1

Bạn nên bao gồm các cạnh tranh ffmpeg console đầu ra cho mỗi lệnh ffmpeg của bạn. – LordNeckbeard

Trả lời

3

Sau một số nghiên cứu, tìm ra lý do tại sao -slang không hoạt động. Trong thực tế, bạn sử dụng một phiên bản gần đây của ffmpeg và đó là một điều tốt nhưng nếu the documentation vẫn mô tả các tùy chọn, bạn có thể tìm thấy trong ChangeLog:

version 0.9: 
... 
* -metadata can now be used to set metadata on streams and chapters, e.g. 
     -metadata:s:1 language=eng sets the language of the first stream to 'eng'. 
     This made -vlang/-alang/-slang options redundant, so they were removed. 

Khi bạn tìm thấy một ví dụ dòng lệnh, kiểm tra xem tùy chọn được sử dụng là trong phiên bản ffmpeg của bạn.

ffmpeg --help >> ffmpeg-doc.txt 

Tùy chọn -slang không có trong.

Nhưng nó cũng chứng minh rằng các tài liệu trên mạng về ffmpeg là đôi khi không chính xác liên quan đến việc thay đổi mã.

+1

Cảm ơn bạn đã xóa thông tin đó. Bất kỳ ý tưởng nào tại sao lệnh siêu dữ liệu này có vẻ lập chỉ mục các luồng từ 1 trong khi khi ánh xạ luồng và thực hiện các hành động khác, luồng được lập chỉ mục từ 0? Tôi đã có thể nghĩ rằng '-metadata: s: 1 language = eng' sẽ đặt luồng thứ hai thành tiếng Anh và để thiết lập luồng đầu tiên bạn sẽ sử dụng' -metadata: s: 0 language = eng'. Có suy nghĩ gì không? – Sam

+0

Không có ý tưởng về chỉ số siêu dữ liệu lạ bắt đầu từ 1. – alexbuisson

+1

Chỉ mục này * là * phù hợp với phần còn lại của chỉ mục. Mọi thứ bắt đầu từ 0 (lập trình viên, tiếng thở dài ...). Trong trường hợp này, luồng 0 là luồng video (điều này luôn xảy ra với MP4?).Vì vậy, bạn chỉ định âm thanh đầu tiên là '-metadata: s: 1' (luồng thứ 2 trong tệp) hoặc chính xác hơn là' -metadata: s: a: 0' (luồng * âm thanh * đầu tiên trong tệp) . – jimtut

6

Tùy chọn

-metadata:s:1 language=eng

ngôn ngữ bộ siêu dữ liệu để eng trên dòng id 1 (đó là, trong những trường hợp điển hình, là người đầu tiên âm thanh dòng). Trong khi tùy chọn

-metadata:s:s:0 language=eng
đặt ngôn ngữ siêu dữ liệu thành eng dòng luồng phụ đề đầu tiên.

Từ ffmpeg manpage:

-metadata[:metadata_specifier] key=value (output,per-metadata) Set a metadata key/value pair. An optional metadata_specifier may be given to set metadata on streams or chapters. See "-map_metadata" documentation for details.
s[:stream_spec] per-stream metadata. stream_spec is a stream specifier as described in the Stream specifiers chapter. In an input metadata specifier, the first matching stream is copied from. In an output metadata specifier, all matching streams are copied to.

Và cuối cùng từ đầu cột của specifiers suối, chúng ta thấy

Possible forms of stream specifiers are: stream_index Matches the stream with this index. E.g. "-threads:1 4" would set the thread count for the second stream to 4. stream_type[:stream_index] stream_type is one of: 'v' for video, 'a' for audio, 's' for subtitle, 'd' for data and 't' for attachments. If stream_index is given, then matches stream number stream_index of this type. Otherwise matches all streams of this type.
Các vấn đề liên quan