basicconverters.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import logging
  2. from lvc import converter
  3. class WebM_UHD_VP8(converter.FFmpegConverterInfo1080p):
  4. media_type = 'format'
  5. extension = 'webm'
  6. parameters = ('-f webm -vcodec libvpx -g 120 -lag-in-frames 23 '
  7. '-deadline good -cpu-used 0 -vprofile 0 -qmax 51 -qmin 11 '
  8. '-slices 4 -b:v 4M -acodec libvorbis -ab 128k '
  9. '-map_metadata -1 '
  10. '-ar 44100')
  11. class WebM_HD_VP8(converter.FFmpegConverterInfo720p):
  12. media_type = 'format'
  13. extension = 'webm'
  14. parameters = ('-f webm -vcodec libvpx -g 120 -lag-in-frames 16 '
  15. '-deadline good -cpu-used 0 -vprofile 0 -qmax 51 -qmin 11 '
  16. '-slices 4 -b:v 2M -acodec libvorbis -ab 112k '
  17. '-map_metadata -1 '
  18. '-ar 44100')
  19. class WebM_SD_VP8(converter.FFmpegConverterInfo480p):
  20. media_type = 'format'
  21. extension = 'webm'
  22. parameters = ('-f webm -vcodec libvpx -g 120 -lag-in-frames 16 '
  23. '-deadline good -cpu-used 0 -vprofile 0 -qmax 53 -qmin 0 '
  24. '-b:v 768k -acodec libvorbis -ab 112k -map_metadata -1 '
  25. '-ar 44100')
  26. class WebM_UHD_VP9(converter.FFmpegConverterInfo1080p):
  27. media_type = 'format'
  28. extension = 'webm'
  29. parameters = ('-f webm -vcodec libvpx-vp9 -g 120 -lag-in-frames 23 '
  30. '-deadline good -cpu-used 0 -vprofile 0 -qmax 51 -qmin 11 '
  31. '-slices 4 -b:v 4M -acodec libopus -ab 128k '
  32. '-map_metadata -1')
  33. class WebM_HD_VP9(converter.FFmpegConverterInfo720p):
  34. media_type = 'format'
  35. extension = 'webm'
  36. parameters = ('-f webm -vcodec libvpx-vp9 -g 120 -lag-in-frames 16 '
  37. '-deadline good -cpu-used 0 -vprofile 0 -qmax 51 -qmin 11 '
  38. '-slices 4 -b:v 2M -acodec libopus -ab 112k '
  39. '-map_metadata -1')
  40. class WebM_SD_VP9(converter.FFmpegConverterInfo480p):
  41. media_type = 'format'
  42. extension = 'webm'
  43. parameters = ('-f webm -vcodec libvpx-vp9 -g 120 -lag-in-frames 16 '
  44. '-deadline good -cpu-used 0 -vprofile 0 -qmax 53 -qmin 0 '
  45. '-b:v 768k -acodec libopus -ab 112k -map_metadata -1')
  46. class WebM_VP9(converter.FFmpegConverterInfo):
  47. media_type = 'format'
  48. extension = 'webm'
  49. parameters = ('-f webm -vcodec libvpx-vp9 -g 240 -threads 4 '
  50. '-quality good -crf 32 '
  51. '-b:v 0 -acodec libopus -map_metadata -1')
  52. class WebM_VP8(converter.FFmpegConverterInfo):
  53. media_type = 'format'
  54. extension = 'webm'
  55. parameters = ('-f webm -vcodec libvpx -g 240 -threads 4 '
  56. '-quality good -crf 32 '
  57. '-b:v 0 -acodec libvorbis -map_metadata -1')
  58. class MP4(converter.FFmpegConverterInfo):
  59. media_type = 'format'
  60. extension = 'mp4'
  61. parameters = ('-acodec aac -ab 128k -vcodec libx264 -preset slow '
  62. '-map_metadata -1 '
  63. '-f mp4 -crf 22')
  64. class MP3(converter.FFmpegConverterInfo):
  65. media_type = 'format'
  66. extension = 'mp3'
  67. parameters = '-f mp3 -ac 2'
  68. audio_only = True
  69. class OggVorbis(converter.FFmpegConverterInfo):
  70. media_type = 'format'
  71. extension = 'ogg'
  72. parameters = '-f ogg -vn -acodec libvorbis -aq 60'
  73. audio_only = True
  74. class OggTheora(converter.FFmpegConverterInfo):
  75. media_type = 'format'
  76. extension = 'ogv'
  77. parameters = ('-f ogg -vcodec libtheora -acodec libvorbis '
  78. '-qscale:v 7 -qscale:a 5 -map_metadata -1')
  79. class DNxHD_1080(converter.FFmpegConverterInfo1080p):
  80. media_type = 'format'
  81. extension = 'mov'
  82. parameters = ('-r 23.976 -f mov -vcodec dnxhd -b:v '
  83. '175M -acodec pcm_s16be -ar 48000')
  84. class DNxHD_720(converter.FFmpegConverterInfo720p):
  85. media_type = 'format'
  86. extension = 'mov'
  87. parameters = ('-r 23.976 -f mov -vcodec dnxhd -b:v '
  88. '175M -acodec pcm_s16be -ar 48000')
  89. class PRORES_720(converter.FFmpegConverterInfo720p):
  90. media_type = 'format'
  91. extension = 'mov'
  92. parameters = ('-f mov -vcodec prores -profile 2 '
  93. '-acodec pcm_s16be -ar 48000')
  94. class PRORES_1080(converter.FFmpegConverterInfo1080p):
  95. media_type = 'format'
  96. extension = 'mov'
  97. parameters = ('-f mov -vcodec prores -profile 2 '
  98. '-acodec pcm_s16be -ar 48000')
  99. class AVC_INTRA_1080(converter.FFmpegConverterInfo1080p):
  100. media_type = 'format'
  101. extension = 'mov'
  102. parameters = ('-f mov -vcodec libx264 -pix_fmt yuv422p '
  103. '-crf 0 -intra -b:v 100M -acodec pcm_s16be -ar 48000')
  104. class AVC_INTRA_720(converter.FFmpegConverterInfo720p):
  105. media_type = 'format'
  106. extension = 'mov'
  107. parameters = ('-f mov -vcodec libx264 -pix_fmt yuv422p '
  108. '-crf 0 -intra -b:v 100M -acodec pcm_s16be -ar 48000')
  109. class NullConverter(converter.FFmpegConverterInfo):
  110. media_type = 'format'
  111. extension = None
  112. def get_parameters(self, video):
  113. params = []
  114. if not video.audio_only and self.should_copy_video_size(video):
  115. # -vcodec copy copies the video data exactly. Only use it if the
  116. # output video is the same size as the input video (#19664)
  117. params.extend(['-vcodec', 'copy'])
  118. params.extend(['-acodec', 'copy'])
  119. return params
  120. def should_copy_video_size(self, video):
  121. if self.width is None or self.height is None:
  122. return True
  123. return (video.width == self.width and video.height == self.height)
  124. def get_extra_arguments(self, video, output):
  125. if not video.container:
  126. logging.warn("sameformat: video.container is None. Using mp4")
  127. container = 'mp4'
  128. elif isinstance(video.container, list):
  129. # XXX: special case mov,mp4,m4a,3gp,3g2,mj2
  130. container = 'mp4'
  131. else:
  132. container = video.container
  133. return ['-f', container]
  134. mp3 = MP3('MP3')
  135. ogg_vorbis = OggVorbis('Ogg Vorbis')
  136. audio_formats = ('Audio', [mp3, ogg_vorbis])
  137. webm_uhd_vp8 = WebM_UHD_VP8('WebM 1080p VP8')
  138. webm_hd_vp8 = WebM_HD_VP8('WebM 720p VP8')
  139. webm_sd_vp8 = WebM_SD_VP8('WebM 480p VP8')
  140. webm_vp8 = WebM_VP8('WebM VP8')
  141. webm_uhd_vp9 = WebM_UHD_VP9('WebM 1080p VP9')
  142. webm_hd_vp9 = WebM_HD_VP9('WebM 720p VP9')
  143. webm_sd_vp9 = WebM_SD_VP9('WebM 480p VP9')
  144. webm_vp9 = WebM_VP9('WebM VP9')
  145. mp4 = MP4('MP4')
  146. theora = OggTheora('Ogg Theora')
  147. video_formats = ('Video',
  148. [
  149. webm_uhd_vp8,
  150. webm_hd_vp8,
  151. webm_sd_vp8,
  152. webm_vp8,
  153. webm_uhd_vp9,
  154. webm_hd_vp9,
  155. webm_sd_vp9,
  156. webm_vp9,
  157. mp4,
  158. theora
  159. ])
  160. dnxhd_1080 = DNxHD_1080('DNxHD 1080p')
  161. dnxhd_720 = DNxHD_720('DNxHD 720p')
  162. prores_1080 = PRORES_1080('Prores Ingest 1080p')
  163. prores_720 = PRORES_720('Prores Ingest 720p')
  164. avc_intra_1080 = PRORES_1080('AVC Intra 1080p')
  165. avc_intra_720 = PRORES_720('AVC Intra 720p')
  166. ingest_formats = ('Ingest Formats', [dnxhd_1080, dnxhd_720, prores_1080,
  167. prores_720, avc_intra_1080,
  168. avc_intra_720])
  169. null_converter = NullConverter('Same Format')
  170. converters = [video_formats, audio_formats, ingest_formats, null_converter]