meta data for this page
  •  

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
linux:multimedia:movie [2015/12/14 10:57]
niziak
linux:multimedia:movie [2021/02/07 11:21] (current)
niziak
Line 1: Line 1:
-==== H.264 params ====+====== Movie ====== 
 + 
 +===== Extract frames ===== 
 +  * Extract keyframes 
 +    * **-hide_banner** we are using this parameter to hide ffmpeg compilation information 
 +    * **-vsync vfr**: This is a parameter that tells the filter to use a variable bitrate video synchronization. If we do not use this parameter ffmpeg will fail to find only the keyframes and shoud extract other frames that can be not processed correctly. 
 +<code bash>​ffmpeg -i VIDEO0068.mp4 -vf "​select=eq(pict_type\,​I)"​ -vsync vfr thumb%04d.bmp -hide_banner</​code>​ 
 +  * Extract one frame per second 
 +<code bash>​ffmpeg -i video.webm -vf fps=1 thumb%04d.jpg -hide_banner</​code>​ 
 +  * Extract one frame per 10 seconds 
 +<code bash>​ffmpeg -i video.webm -vf fps=1/10 thumb%04d.jpg -hide_banner</​code>​ 
 +  * Extract with different quality / to bmp 
 +<code bash>​ffmpeg -i video.webm -vf fps=1 -quality 90 thumb%04d.jpg -hide_banner</​code>​ 
 +<code bash>​ffmpeg -i video.webm -vf fps=1 thumb%04d.bmp -hide_banner</​code>​ 
 +  * Extract only one frame 
 +<code bash>​ffmpeg -i video.webm -ss 00:​00:​07.000 -vframes 1 thumb.jpg</​code>​ 
 + 
 +===== Chroma subsampling ===== 
 +[[https://​en.wikipedia.org/​wiki/​Chroma_subsampling]] 
 +{{ :​linux:​multimedia:​sampling.jpg?​200|}} 
 +{{ :​linux:​multimedia:​316-f6-chroma-subsampling-secondary_1.png?​200|}} 
 +  * j:a:b - j - horizontal sampling reference (usually 4). **a** number of chroma samples (Cr, Cb) in the first row of **j** pixels. **b** number of changes of chroma samples between firs and second row of **j** pixels. 
 +  * 4:4:4 - (H265, H264) - no chroma subsampling - for every 4 pixels of luma, there are 4 pixels of colour 
 +  * 4:2:2 - 50Mbit - (H264) for every 4 pixels of luma, there are 2 pixels of colour. Keying can produce bad edges. 
 +  * 4:2:0 - 35MBit - (DVD, DV, JPEG, MPEG1, Blueray) - only alternatign lines are sampled for chroma. Chroma vertical resolution is halved. 
 + 
 + 
 +===== Stabilisation ===== 
 + 
 +==== To remove Little shaking in 1-pass ==== 
 + 
 +<code bash>​ffmpeg -threads 8 -i $1 -vf deshake -c:a copy -c:v utvideo yuv420p $1-deshake.mkv</​code>​ 
 +NOTE: No multithreading. 
 + 
 +==== To completely process shaky video in 2-pass| ==== 
 + 
 +FFMpeg already contains plugins **vidstabdetect** and **vidstabtransform** [[http://​public.hronopik.de/​vid.stab/​download.php]]. 
 +But latest version (supports multithreading) can be downloaded as statically linked binary from: [[https://​www.johnvansickle.com/​ffmpeg/​]] 
 + 
 +<code bash> 
 +ffmpeg -i $1 -vf vidstabdetect=shakiness=10:​accuracy=15:​result="​tracefile.trf":​show=1 -c:a copy -c:v utvideo ${PIX_FMT} ${OFILE}-vidstab1.mkv 
 +ffmpeg -i $1 -vf vidstabtransform=input="​tracefile.trf"​ -c:a copy -c:v utvideo ${PIX_FMT} ${OFILE}-vidstab2.mkv 
 +</​code>​ 
 +NOTE: output from pass1 is also written as video to see motion vectors. 
 + 
 + 
 + 
 + 
 + 
 +===== Lossless ===== 
 + 
 +Use UT Video codec as better alternative to HUFYUV: [[https://​en.wikipedia.org/​wiki/​Ut_Video_Codec_Suite]] 
 +  * Download for Windows: https://​www.videohelp.com/​software/​Ut-Video-Codec-Suite 
 +  * Supported by ffmpeg 
 +<code bash>​ffmpeg -i $1 -vf deshake -c:a copy -c:v utvideo -pix_fmt yuv422p $1-deshake.mkv</​code>​ 
 + 
 +Comparison of file size: 
 +^ pixfmt ^ huffyuv ^ utvideo ^ 
 +| 444p   ​| ​        | 4104M   | 
 +| 422p   | 4077M   | 3204M   |  
 +| 420p   ​| ​        | 2556M   | 
 + 
 +The same video encoded using **utvideo** @422p is 78% of **huffyuv**. 
 +===== MPEG2 ===== 
 +Highest quality (qscale 4-5 is far enough) 
 +<​code>​-c:​v mpeg2video -qscale:v 2</​code>​ 
 +==== DVD ==== 
 +DVD's VOBS can be simply concatenated to one big file: 
 +<code bash>cat ./​VIDEO_TS/​*.VOB | ffmpeg -i - <​out_name>​.<​out_format></​code>​ 
 + 
 +<code bash> 
 +#!/bin/bash -eu 
 + 
 +VOBS=""​ 
 +while read VOB; do 
 +    echo ${VOB} 
 +    if [ -n "​${VOBS}"​ ]; then 
 + VOBS="​${VOBS}|"​ 
 +    fi 
 +    VOBS="​${VOBS}${VOB}"​ 
 +done < <(ls -1 *.VOB) 
 + 
 +ffmpeg -i "​concat:​${VOBS}"​ -map 0:0 -map 0:1 -map 0:2 -c copy out.ts 
 +</​code>​ 
 +More: [[https://​newspaint.wordpress.com/​2016/​07/​27/​ripping-a-video-from-dvd-using-ffmpeg/​]] 
 + 
 + 
 +===== H.264 params ​=====
 CRF (Constant Rate Factor), 0..51  (0-lossless) CRF (Constant Rate Factor), 0..51  (0-lossless)
-17..23 very good, no blocking efect furing ​fast movement +  * 17..23 very good, no blocking efect during ​fast movement 
-23 - default+  ​* ​23 - default
  
 +<​code>​-c:​v libx264 -crf 25</​code>​
 +<​code>​-c:​v libx264 -b:v 1024k</​code>​
  
-=== Change container ===+===== FFMpeg params ===== 
 +2.5Mbps bitrate with tolerance 300k 
 +<​code>​-b 2500k -bt 300k</​code>​ 
 + 
 +==== Resize ==== 
 +to half of size (using video filter [[https://​ffmpeg.org/​ffmpeg-filters.html#​scale]] 
 +<​code>​-vf scale=w=iw/​2:​h=ih/​2</​code>​ 
 + 
 +==== Audio recompress ==== 
 +1 channel audio (mono), audio quality 7 [[https://​trac.ffmpeg.org/​wiki/​Encode/​MP3]] 
 +<​code>​-ac 1 -c:a libmp3lame -q:a 7</​code>​ 
 + 
 +===== Examples ===== 
 + 
 +==== Change container ​====
 <​code>​ffmpeg -i input.ts -vcodec copy -sameq -acodec copy -f matroska output.ts</​code>​ <​code>​ffmpeg -i input.ts -vcodec copy -sameq -acodec copy -f matroska output.ts</​code>​
  
-==== Examples ​==== +==== Copy video and compress audio ==== 
-=== Recompress ===+Create mono mp3 audio stream: 
 +<code bash>​ffmpeg -i input_file.avi -c:v copy -ac 1 -c:a libmp3lame -q:a 7 output.avi</​code>​ 
 + 
 +==== Remove audio ==== 
 +<code bash>​ffmpeg -i example.mkv -c copy -an example-nosound.mkv</​code>​ 
 + 
 +==== Recompress ===
 +<​code>​
 ffmpeg -i input.mp4 -b 1000000 output.mp4 ffmpeg -i input.mp4 -b 1000000 output.mp4
 ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4 ffmpeg -i input.mp4 -vcodec libx264 -crf 20 output.mp4
Line 15: Line 125:
 ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4 ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
 ffmpeg -i input.ts -c:a copy -c:v libx264 -crf 18 -preset veryfast NL.mp4 ffmpeg -i input.ts -c:a copy -c:v libx264 -crf 18 -preset veryfast NL.mp4
 +ffmpeg -i input.mkv -c:v copy -c:a 
 +</​code>​
 +
 +Limit CPU usage to 150% (2 CPUs)
 +<​code>​cpulimit -z -e ffmpeg -l 150</​code>​
 +
 +==== Cut ====
 +Cut input from 11:20 to 1:45:50:
 +
 +Example below (option order -i and -ss) will decode input from beginning frame by frame and starts processing at 11:20 and stops at 1:45:50.
 +<​code>​
 +ffmpeg -i input.mp4 -ss 11:20 -to 1:45:50 -c:a copy -c:v copy  output.mp4
 +</​code>​
 +
 +Next example (option order -ss and then -i) will seek to position 11:20 using keyframes and start processing for 1:​34:​30. ​
 +<​code>​
 +ffmpeg -ss 11:20 -i input.mp4 -to 1:34:30 -c:a copy -c:v copy  output.mp4
 +</​code>​
 +This is faster solution.
 +
 +In both examples video codes is "​copy"​ so seeking works using I-frames, so there is no speed difference. Additionally with "​copy",​ it is possibilty
 +to select time range without keyframes, so only audio will be copied and video will start from next valid key frame.
 +
 +Copy chosen streams:
 +<​code>​ffmpeg -i test.ts -to 5:47 -map 0:0 -map0:1 -map 0:4 -c copy cut.mkv</​code>​
 +
 +Copy chosen streams and recompress video stream:
 +<​code>​ffmpeg -i test.ts -to 5:47 -map 0:0 -map0:1 -map 0:4 -c copy -c:v libx264 -crf 25 cut.mkv</​code>​
 +
 +Copy chosen streams and resize to 50%, recompress video stream:
 +<code bash>​ffmpeg -i test.ts -to 5:47 -map 0:0 -map0:1 -map 0:4 -c copy -c:v libx264 -crf 25 -vf scale=w=iw/​2:​h=ih/​2 cut.mkv</​code>​
 +
 +==== Deinterlace ====
  
 +<code bash> ffmpeg -i test.ts -vf yadif -vcodec ... -acodec ... test.mp4</​code>​
  
 vidia vidia
Line 21: Line 165:
 https://​www.maketecheasier.com/​convert-video-to-mp4-handbrake-linux/​ https://​www.maketecheasier.com/​convert-video-to-mp4-handbrake-linux/​
  
 +===== Issues =====
 + * **deprecated pixel format used, make sure you did set range correctly**
 +   * when using **yuv420p** pixel format