Bài giảng - Giáo trình

[Bài giảng][bleft]

Thư viện - Đồ án

[Thư viện][bsummary]

Tin tức

[Tin tức][twocolumns]

Tài liệu

[Tài liệu][bleft]

Tìm hiểu full Code FFMPEG để Chuyển đổi định dạng video

FFmpeg là một công cụ có rất nhiều tiện ích cho việc xử lý video. Đây là một công cụ vừa gọn nhẹ vừa hiệu quả nên được rất nhiều chuyên gia trong "giới" encode video sử dụng và cộng đồng sử dụng ffmpeg ở Việt Nam lại càng phát triển.



Thường câu lệnh FFMPEG có dạng

ffmpeg -i <đường dẫn tệp tin> <đường dẫn output>

-i : input file

 

Chuyển đổi MPEG sang 3GP:

ffmpeg -i movie1.mpeg -ab 8.85k -acodec libamr_wb -ac 1 -ar 16000 -vcodec h263 -s qcif movie2.3gp

-acodec : định dạng audio

libarm_wb : tên lib arm

-ac : audio chanel kênh phát sóng của audio 1 mono 2 stereo

-ar : audio bitrate số bit âm thanh trên 1 giây

-vcodec : định dạng video

h263,h264 : tên lib định dạng của video

qcif:

                  Format               Video Resolution

                    SQCIF                        128 × 96

                    QCIF                          176 × 144

                    SCIF                          256 x 192

                    SIF(525)                  352 x 240

                    CIF/SIF(625)          352 × 288

                    4SIF(525)                 704 x 480

                    4CIF/4SIF(625)      704 × 576

                    16CIF                         1408 × 1152

                    DCIF                           528 × 384

Chuyển đổi file video sang audio :

ffmpeg -i input.mp4 -vn -ab 320 output.mp3

-vn : video none

-ab : audio bitrate

ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3

-vn – tắt video record ở file đầu ra, chỉ còn lại âm thanh

-ar - Thiết lập tần số âm thanh của tập tin đầu ra. Các giá trị comman được sử dụng là 22050, 44100, 48000 Hz.

-ac - Đặt số kênh âm thanh.

-ab - Chỉ ra bitrate âm thanh.

-f - định dạng tập tin đầu ra.

 

Chuyển đổi độ phân giải của video

ffmpeg -i input.mp4 -filter:v scale=1280:720 -c:a copy output.mp4

 

ffmpeg -i input.mp4 -s 640x480 -c:a copy output.mp4

-s : chuyển đổi kích thước video

 

Tắt âm thanh của video

ffmpeg -i video.mp4 -an mutevideo.mp4

-an : tắt âm thanh video

 

Copy clip

ffmpeg -i input.mp4 -ss 13:38 -t 02:00 -c copy output.mp4

-ss : skip đến phút thứ 13 giây 38

-t : duration, process input trong 2 phút

-c copy : codec. copy

 

Nén file video

ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4

 

Xuất hình từ file video

ffmpeg -i input.mp4 -r 1 -f image2 image-%2d.png

-r – frame rate, mặc định là 25 fps.

-f - Cho biết định dạng đầu ra

image-%2d.png – xuất ra tên

 

Thêm subtitle vào file video

fmpeg -i input.mp4 -i subtitle.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast output.mp4

1080 qua 720

ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4

-vf : video, filter

Scale : scale filter, thay đổi kích thước

 

Thêm logo lên video

ffmpeg -i in.mp4 -framerate 25 -loop 1 -i logo.png -filter_complex "[1:v] fade=out:st=30:d=1:alpha=1 [ov]; [0:v][ov] overlay=10:10 [v]" -map "[v]" -map 0:a -c:v libx264 -c:a copy -shortest out.mp4

filter_complex : hiệu ứng của video và audio, [1:v] lấy input logo.png (1 index của logo trong câu lệnh, v: video vd [0:a] thì trong đó 0 là indext và a là audio tức audio của video); fade=out:st=30:d=1:alpha=1 di chuyển trong 30px 1s có alpha di chuyển bằng 1, overlay vị trí hiển thị của logo.

 

Audio Encode

AAC

Bộ mã hóa mã hóa âm thanh tiên tiến (AAC).

Bộ mã hóa này là bộ mã hóa AAC mặc định, được thực hiện thành FFmpeg. Chất lượng của nó ngang bằng hay tốt hơn libfdk_aac ở tốc độ bit mặc định là 128kbps. Bộ mã hoá này cũng thực hiện thêm nhiều lựa chọn, hồ sơ và bộ tự điển hơn các bộ mã hóa khác (chỉ với hồ sơ AAC-HE đang được triển khai) nên bộ mã hóa này đã trở thành mặc định và là sự lựa chọn được đề nghị.

ffmpeg -i input.mp4 -c:a aac -b:a 128k -strict -2 output.mp3

libmp3lame

ffmpeg -i input.wav -codec:a libmp3lame -qscale:a 2 output.mp3

-qscale: a 2, có nghĩa là sử dụng tùy chọn -V2 của LAME, cho một luồng âm thanh MP3 MP3 với bitrate stereo trung bình là 170-210 kBit / s.

LAME Bitrate Overview

lame option

Average kbit/s

Bitrate range kbit/s

ffmpeg option

-b 320

320

320 CBR (non VBR) example

-b:a 320k (NB this is 32KB/s, or its max)

-V 0

245

220-260

-q:a 0 (NB this is VBR from 22 to 26 KB/s)

-V 1

225

190-250

-q:a 1

-V 2

190

170-210

-q:a 2

-V 3

175

150-195

-q:a 3

-V 4

165

140-185

-q:a 4

-V 5

130

120-150

-q:a 5

-V 6

115

100-130

-q:a 6

-V 7

100

80-120

-q:a 7

-V 8

85

70-105

-q:a 8

-V 9

65

45-85

-q:a 9

 

Video Encode

Libx264

ffmpeg -i foo.mpg -c:v libx264 -x264opts keyint=123:min-keyint=20 -an out.mkv

-x264opts : các tùy chọn (options) của bộ mã hóa H264

keyint :

min-keyint : kích thước GOP (group of pictures) tối thiểu

 

ffmpeg -i INPUT -c:v libx264 -x264-params level=30:bframes=0:weightp=0:\
cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:\
no-fast-pskip=1:subq=6:8x8dct=0:trellis=0 OUTPUT

 

libx265

ffmpeg -i input -c:v libx265 -x265-params crf=26:psy-rd=1 output.mp4

-x265-params : truyền vào các tham số của bộ encode H265

GOP Size (Min/Max) - min-keyint, keyint : Số lượng Frames tối thiểu và tối đa trước đi 1 Key Frame được chèn vào bởi x264.
Ví dụ giá trị min-keyint hay Min GOP Size thường được chọn bằng với giá trị fps. Fps là số lượng Frame có trong 1 giây. Thông thường Fps=24 ==> Ít nhất sau 24 Frames mới có 1 Key Frame được chèn vào. Việc chọn giá trị này sẽ đảm bảo không bao giờ có 2 Key Frames cùng xuất hiện trong vòng 1 giây (việc đó sẽ chỉ làm cho dung lượng bản encode tăng cao mà chất lượng hầu như không khác biệt). 
Tương tự, Max GOP Size = X sẽ đảm bảo phải có 1 Key Frame xuất hiện cứ sau X Frame. 1 Video có quá ít Key Frame sẽ dẫn đến việc chất lượng giảm sút, và dễ gây hiện tượng lag khi nhảy đến 1 thời điểm nhất định của video (do điểm đó không có Key Frame, video sẽ phải tìm kiếm Key Frame tiếp theo xuất hiện).
Như đã nói, giá trị Min GOP Size(min-keyint) thường được chọn bằng với giá trị fps. Còn Max GOP Size(keyint) được khuyến cáo bằng 10 lần giá trị fps (đảm bảo rằng nếu hiện tượng lag xuất hiện cũng sẽ chỉ kéo dài trong tối đa 10 giây). Giá trị lớn nhất mà min-keyint có thể nhận là keyint/2+1 

 

Scene Cut - scenecut: Cho x264 quyết định mức độ nhạy khi chuyển cảnh. x264 sẽ tính toán giá trị cho mỗi frame để xem độ khác biệt giữa nó với các frame trước. Từ giá trị này, nó sẽ quyết định khi nào video xuất hiện việc chuyển cảnh và do đó sẽ cần phải chèn vào Key Frame. Giá trị này càng lớn, x264 sẽ càng nhạy hơn với các phần chuyển cảnh. Ví dụ 1 video với các camera chuyển động ít sẽ đòi hỏi giá trị này cao hơn.

 

Nếu bạn muốn video của mình có khả năng tương thích cao với các thiết bị cũ (ví dụ: điện thoại Android thế hệ trước):

-profile:v baseline -level 3.0

Điều này làm mất đi một số tính năng nâng cao nhưng lại tương thích tốt hơn. Thông thường, bạn không cần cài đặt này (và do đó tránh sử dụng -profile: v và -level), nhưng nếu bạn sử dụng cài đặt này, nó có thể tăng tốc độ bit so với những gì cần thiết để đạt được cùng chất lượng trong các profile cao hơn.

iOS

iOS Compatability (source)

Profile

Level

Devices

Options

Baseline

3.0

All devices

-profile:v baseline -level 3.0

Baseline

3.1

iPhone 3G and later, iPod touch 2nd generation and later

-profile:v baseline -level 3.1

Main

3.1

iPad (all versions), Apple TV 2 and later, iPhone 4 and later

-profile:v main -level 3.1

Main

4.0

Apple TV 3 and later, iPad 2 and later, iPhone 4s and later

-profile:v main -level 4.0

High

4.0

Apple TV 3 and later, iPad 2 and later, iPhone 4s and later

-profile:v high -level 4.0

High

4.1

iPad 2 and later, iPhone 4s and later, iPhone 5c and later

-profile:v high -level 4.1

High

4.2

iPad Air and later, iPhone 5s and later

-profile:v high -level 4.2

 

Libvpx (VP8)

libvpx cung cấp một chế độ bitrate biến theo mặc định. Trong chế độ này, nó chỉ đơn giản là cố gắng đạt đến tỷ lệ bit được xác định trung bình, ví dụ: 1 MBit / s.

ffmpeg -i input.mp4 -c:v libvpx -b:v 1M -c:a libvorbis output.webm

 

VP9

ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 2M output.webm

libvpx-vp9 cung cấp một chế độ bitrate biến đơn giản (VBR) theo mặc định. Trong chế độ này, nó chỉ đơn giản là cố gắng đạt đến tỷ lệ bit được xác định trung bình, ví dụ: 2 MBit / s.

Thường không nên sử dụng chế độ này vì đầu ra có thể không nén hiệu quả hoặc dẫn đến các biến thể chất lượng. Thay vào đó, hãy sử dụng mã hóa Hai-Pass hoặc Constant Quality.

 

 

ffmpeg -i big_buck_bunny_720p_10mb.mp4 -i FPT_New_Logo.png -c:a copy -filter_complex 'overlay=W-w-125:H-h-78' big_buck_bunny_720p_10mb_logo.mp4

center: overlay=(W-w)/2:(H-h)/2

top_left:  overlay=5:5   5 pixcel

top_right:  overlay=W-w-5:5  5 pixcel

bottom_right:  overlay=W-w-5:H-h-5 5 pixcel

bottom_left:  overlay=5:H-h-5  5 pixcel

 

 

 

ffmpeg -i input -i logo1 -i logo2 -filter_complex 'overlay=x=10:y=H-h-10,overlay=x=W-w-10:y=H-h-10' output

ffmpeg -i big_buck_bunny_720p_10mb.mp4 -filter_complex "drawtext=fontsize=30:fontfile=/usr/share/fonts/gnu-free/FreeSerif.ttf:text='Hello World':x=(w-text_w)/2:y=(h-text_h)/2" -c:a copy big_buck_bunny_720p_10mb_text1.mp4

Cố định bitrate cho luồng video trực tuyến

ffmpeg -re -i INPUT -vcodec libx264 -s 1280×720 -b:v #{bandwidth}k -minrate:v #{bandwidth}k -maxrate:v #{bandwidth}k -muxrate #{bandwidth}+128*1.05 -bufsize #{bandwidth/4}k -nal-hrd cbr -c:a aac -strict -2 -ar 48000 -b:a 192k -packetsize 188 -f flv rtmp://IP_SERVER:1935/APP/stream_name

 

 

Main options

-f fmt (input/output)

Buộc định dạng input hoặc output file. Định dạng này thường được tự động phát hiện cho các tập tin đầu vào và được đoán từ phần mở rộng của tập tin cho các tệp xuất, do đó, trong hầu hết các trường hợp, tùy chọn này không cần thiết.

 

-i url (input) : input file url

-y (global) : ghi đè output file mà không cần hỏi

-n (global) : Không ghi đè output file, và thoát ra ngay lập tức nếu có một output file tồn tại

 

-stream_loop number (input)

Đặt số lần luồng đầu vào phải được lặp lại. Loop 0 có nghĩa là không có vòng lặp, vòng lặp -1 có nghĩa là vòng lặp vô hạn.

 

-c [: stream_specifier] codec (input/output, per-stream)

-codec [: stream_specifier] codec (input/output, per-stream)

Chọn bộ mã hóa (khi được sử dụng trước tệp xuất) hoặc bộ giải mã (khi được sử dụng trước tệp nhập) cho một hoặc nhiều luồng. codec là tên của bộ giải mã / bộ mã hóa hoặc bản sao giá trị đặc biệt (chỉ xuất) để cho biết rằng luồng không được mã hoá lại.

Sưu tầm và biên soạn bởi Nguyễn Quang (dangquangkdc)

 

Không có nhận xét nào: