Преобразование из файла WMV в MP4 завершается неудачно с помощью FFmpeg

16805
Tim

При преобразовании файла WMV в файл MP4, он говорит

[mp4 @ 0x989c160] дорожка 1: не удалось найти тег, кодек в настоящее время не поддерживается в контейнере

а также

Не удалось записать заголовок для выходного файла # 0 (неверные параметры кодека?): Операция не разрешена.

Но преобразование файла WMV в файл MKV - это хорошо. Интересно, почему?

Ниже приведены результаты обоих случаев.

Преобразование из файла WMV в файл MP4 не работает

$ ffmpeg -i "1.wmv" -c:v libx264 -crf 23 -c:a copy "1.mp4"  ffmpeg version git-2012-06-03-169dae8 Copyright (c) 2000-2012 the FFmpeg developers built on Jun 3 2012 09:14:54 with gcc 4.6.3 configuration: --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-version3 --enable-x11grab libavutil 51. 56.100 / 51. 56.100 libavcodec 54. 23.100 / 54. 23.100 libavformat 54. 6.101 / 54. 6.101 libavdevice 54. 0.100 / 54. 0.100 libavfilter 2. 77.100 / 2. 77.100 libswscale 2. 1.100 / 2. 1.100 libswresample 0. 15.100 / 0. 15.100 libpostproc 52. 0.100 / 52. 0.100 Guessed Channel Layout for Input Stream #0.0 : stereo Input #0, asf, from '1.wmv': Metadata: WMFSDKVersion : 9.00.00.3267 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 Duration: 01:40:50.70, start: 0.000000, bitrate: 2100 kb/s Stream #0:0(eng): Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, stereo, s16, 128 kb/s Stream #0:1(eng): Video: wmv3 (Main) (WMV3 / 0x33564D57), yuv420p, 640x480, 1974 kb/s, 29.97 tbr, 1k tbn, 1k tbc [buffer @ 0x98c28c0] w:640 h:480 pixfmt:yuv420p tb:1/1000 sar:0/1 sws_param:flags=2 [buffersink @ 0x9894320] No opaque field provided [libx264 @ 0x98b0ec0] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.1 Cache64 [libx264 @ 0x98b0ec0] profile High, level 3.0 [libx264 @ 0x98b0ec0] 264 - core 125 r2200 999b753 - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 [mp4 @ 0x989c160] track 1: could not find tag, codec not currently supported in container Output #0, mp4, to '1.mp4': Metadata: WMFSDKVersion : 9.00.00.3267 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.6.101 Stream #0:0(eng): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 640x480, q=-1--1, 30k tbn, 29.97 tbc Stream #0:1(eng): Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, stereo, 128 kb/s Stream mapping: Stream #0:1 -> #0:0 (wmv3 -> libx264) Stream #0:0 -> #0:1 (copy) Could not write header for output file #0 (incorrect codec parameters ?): Operation not permitted 

Преобразование из файла WMV в файл MKV хорошо:

$ ffmpeg -i "1.wmv" -c:v libx264 -crf 23 -c:a copy "1.mkv"  ffmpeg version git-2012-06-03-169dae8 Copyright (c) 2000-2012 the FFmpeg developers built on Jun 3 2012 09:14:54 with gcc 4.6.3 configuration: --enable-gpl --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-version3 --enable-x11grab libavutil 51. 56.100 / 51. 56.100 libavcodec 54. 23.100 / 54. 23.100 libavformat 54. 6.101 / 54. 6.101 libavdevice 54. 0.100 / 54. 0.100 libavfilter 2. 77.100 / 2. 77.100 libswscale 2. 1.100 / 2. 1.100 libswresample 0. 15.100 / 0. 15.100 libpostproc 52. 0.100 / 52. 0.100 Guessed Channel Layout for Input Stream #0.0 : stereo Input #0, asf, from '1.wmv': Metadata: WMFSDKVersion : 9.00.00.3267 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 Duration: 01:40:50.70, start: 0.000000, bitrate: 2100 kb/s Stream #0:0(eng): Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, stereo, s16, 128 kb/s Stream #0:1(eng): Video: wmv3 (Main) (WMV3 / 0x33564D57), yuv420p, 640x480, 1974 kb/s, 29.97 tbr, 1k tbn, 1k tbc File '1.mkv' already exists. Overwrite ? [y/N] y w:640 h:480 pixfmt:yuv420p tb:1/1000 sar:0/1 sws_param:flags=2 [buffersink @ 0xa0a2760] No opaque field provided [libx264 @ 0xa0b6ec0] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.1 Cache64 [libx264 @ 0xa0b6ec0] profile High, level 3.0 [libx264 @ 0xa0b6ec0] 264 - core 125 r2200 999b753 - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 Output #0, matroska, to '1.mkv': Metadata: WMFSDKVersion : 9.00.00.3267 WMFSDKNeeded : 0.0.0.0000 IsVBR : 0 encoder : Lavf54.6.101 Stream #0:0(eng): Video: h264, yuv420p, 640x480, q=-1--1, 1k tbn, 29.97 tbc Stream #0:1(eng): Audio: wmav2 (a[1][0][0] / 0x0161), 44100 Hz, stereo, 128 kb/s Stream mapping: Stream #0:1 -> #0:0 (wmv3 -> libx264) Stream #0:0 -> #0:1 (copy) Press [q] to stop, [?] for help frame= 325 fps=106 q=29.0 size= 411kB time=00:00:09.20 bitrate= 366.0kbits/s  
5

2 ответа на вопрос

5
slhck

кодек в настоящее время не поддерживается в контейнере

Это твоя ошибка.

Попробуйте указать другой аудиокодек, например, с помощью -c:a libfaac. MP4 не берет Windows Media Audio в свой контейнер. Вы должны выбрать соответствующий аудиокодек, например, AAC. Прямо сейчас все, что вы делаете, это пытаетесь скопировать поток битов, и это терпит неудачу - как указано в сообщении об ошибке.

Та же проблема несоответствующих кодеков касается других контейнеров, хотя MKV гораздо более открыт для других кодеков, чем MP4, поэтому вы можете использовать практически любые кодеки в контейнере MKV. Это не работает для MP4.

В целом, для максимальной совместимости старайтесь придерживаться наиболее распространенных форматов для контейнеров, например:

  • AVI: MPEG-4 видео, MP3 аудио
  • WMV: Windows Media, видео и аудио
  • MKV, MOV, MP4: h.264, аудио AAC (хотя MKV действительно что-то берет, здесь ограничение на стороне устройства воспроизведения)
Спасибо! (1) Как вы знаете, это аудио кодек, а не видео кодек? (2) если указать `-c: libfaac`, какой битрейт рекомендуется для него? Tim 12 лет назад 0
Что касается битрейта, используйте все, что вам нравится. Я уверен, что `-b: 192k 'должно быть достаточно. slhck 12 лет назад 0
@Tim: да, именно аудиокодек не подходит для mp4-контейнера: см. Здесь http://git.videolan.org/?p=ffmpeg.git;a=blob;f=libavformat/movenc.c; h = 54deef4177262e4da943f6b306c01fbff1a9d29f; hb = HEAD # l3475 и libavformat начинает отсчет с 0 для дорожек ; ПП = ГОЛОВКА # l3230 akira 12 лет назад 0
@akira: Спасибо! (1) Откуда ты знаешь, что это не видео кодек? (2) Вы хотите, чтобы я увидел `.audio_codec = CODEC_ID_AAC,` в вашей первой ссылке? Что это говорит по моим вопросам? Tim 12 лет назад 0
@Tim: 1) потому что обе ссылки ссылаются на ПРАВДУ .. иначе код. настройка первой ссылки, которую ffmpeg принимает для кодеков для mp4-контейнера: aac для аудио и либо libx264, либо ffmpeg-mpeg4 для видео. вторая ссылка показывает вам место кода, который генерирует сообщение об ошибке, которое вы видите, прокрутите несколько строк назад, и вы увидите, как ffmpeg начинает считать с 0. Поскольку вы используете libx264 в качестве видеокодека и, таким образом, выполняете требование для видео-кодека остается только логический вывод: вы используете неправильный аудио-кодек (в вашем случае wma2 вместо aac) akira 12 лет назад 1
Вы также можете увидеть, как ffmpeg / avconv (новое имя), какие дорожки находятся в выходном контейнере: `Отображение потока: Поток # 0: 1 -> # 0: 0 (wmv3 -> libx264) Поток # 0: 0 -> # 0: 1 (копия) `... # 0: 1 .. это трек 1, 0-трек это видео-трек. akira 12 лет назад 0
@akira: Вы говорите, что avconv - это замена ffmpeg? Значит, ffmpeg больше не разрабатывается? Tim 12 лет назад 0
@ Тим Нет, это не правда. Libav (который имеет двоичный файл `avconv`) - это просто форк. Они более или менее используют один и тот же код. FFmpeg все еще находится в активной разработке. slhck 12 лет назад 0
@ Тим: нет, я этого не говорил. просто «avconv» является переписанной «версией» самого инструмента «ffmpeg», под (разветвленным от «ffmpeg-project») зонтиком «libav». но совершенно не имеет отношения к вашей проблеме, примите ответ slhck, потому что это _is_ ответ. akira 12 лет назад 0
@slhck: я бы вынул "mkv" из твоего раздела "общие кодеки", mkv просто ест все. «webm» подойдет лучше, а «mov» и «mp4» верны, imho. но "мкв" просто все ест. akira 12 лет назад 0
@akira: Что значит "mkv" просто ест все "? Tim 12 лет назад 0
@slhck: После того, как я закончу преобразование файла wmv в файл kmv, могу ли я преобразовать его в mp4 с помощью `ffmpeg -i 1.kmv -c: v copy -c: libfaac -b: 192k 1.mp4`? Это намного быстрее, потому что нет декодирования и кодирования для видео части, и только для аудио части? Tim 12 лет назад 0
@Tim Точно - если вы копируете видеопоток, вы не будете кодировать, поэтому команда намного быстрее. И да, MKV сможет использовать * любой * кодек, который вы ему подаете, не так как MP4, который имеет множество ограничений. Смотрите: [Сравнение форматов контейнеров] (http://en.wikipedia.org/wiki/Comparison_of_container_formats) slhck 12 лет назад 0
@Tim: если вы хотите получить действительный `.mp4`, тогда ** не ** быстрее кодировать видео и аудио отдельными шагами. просто сделайте все за один шаг: `ffmpeg -i input.wmv -c: v libx264 -crf 23 -c: libfaac -b: 192k out.mp4`. конец истории. болтовня о том, что вы можете хранить внутри `.mkv`, не имеет значения для вашей проблемы, когда вы хотите получить действительный` .mp4`. akira 12 лет назад 0
@Tim Что касается битрейта с libfaac, вы можете альтернативно использовать `-q: a 100` (или любое другое желаемое значение). Это похоже на `faac -q 100`. LordNeckbeard 12 лет назад 0
@LordNeckbeard: Означает ли `-q: a` качество звука? Что означает `-q: 100`? Спасибо! Tim 12 лет назад 0
@ Тим: Да. Смотрите параметр `-q` в` man faac`. LordNeckbeard 12 лет назад 0
3
Justin Buser

попробуйте просто сделать:

ffmpeg -y -i 1.wmv -b:v 2000k 1.mp4 

ffmpeg должен автоматически выбрать наиболее подходящий аудиоформат и использовать для видео libx264, 2000k по сути говорит ему кодировать с той же скоростью передачи битов, что и у исходного видеофайла.

На самом деле, по умолчанию ffmpeg использует MPEG4 для видео в MP4, поэтому вам нужно указать `-c: v libx264` evilsoup 11 лет назад 0

Похожие вопросы