简体   繁体   English

使用ffmpeg for Android对x264视频进行编码(起始偏移量)

[英]Encode x264 video with ffmpeg for Android with starting offset

I'm trying to convert a video to play on an Android device. 我正在尝试将视频转换为可在Android设备上播放。 The video is from a big movie. 该视频来自一部大电影。 I am chopping it back into pieces to correspond with the actual segments of the movie using -ss and -t. 我将其切成碎片,以使用-ss和-t与电影的实际片段相对应。

The input is mp4 with H.264 and AAC. 输入是带有H.264和AAC的mp4。 The output is mkv using H.264 and Vorbis. 使用H.264和Vorbis的输出是mkv。

Specifically, the input is: 具体来说,输入为:

Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 320x240, 2240 kb/s, 29.97 fps, 60 tbr, 90k tbn, 180k tbc
Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, s16, 162 kb/s

I'm using: ffmpeg version 1.0.7 我正在使用:ffmpeg版本1.0.7

The command I'm trying is something like: 我正在尝试的命令是这样的:

ffmpeg -ss 00:03:52.000 -i in.mp4 -t 00:01:00.000 -c:v libx264 -preset medium -crf 20 -maxrate 400k -bufsize 1835k -c:a libvorbis -sn out.mkv

However, while the resulting video works fine on my computer, when I click on my phone, it says: Can't play video and checking the Android log, it has: 但是,虽然生成的视频在我的计算机上可以正常工作,但是当我单击手机时,它显示:无法播放视频并检查Android日志,但它具有:

E/SoftAVC (24319): Decoder failed: -2
E/OMXCodec(24319): [OMX.google.h264.decoder] ERROR(0x80001001, -1007)

It is still able to make a thumbnail for the movie, but not play it. 它仍然可以为电影制作缩略图,但不能播放。

Interestingly, some simple variations of that command do work: Remove -ss to start at the beginning of the video Use -an to disable audio 有趣的是,该命令的一些简单变体可以起作用:删除-ss以在视频的开头开始使用-an禁用音频

These variations still failed: Copying the original audio with -c:a copy, or other audio codecs like vorbis, mp3 Using mp4 instead of mkv Using baseline H.264 profile, including restricting level to 1.2. 这些变化仍然失败:使用-c:a副本或其他音频编解码器(例如vorbis,mp3)复制原始音频使用mp4而不是mkv使用基线H.264配置文件,包括将级别限制为1.2。

Running through mkvmerge first not only fails, but makes Android not able to even make a thumbnail. 首先通过mkvmerge运行不仅失败,而且使Android甚至无法制作缩略图。

I don't know if it is related, but another small thing I noticed is that for starting transcoding later in the movie, the audio starts out slightly out-of-sync. 我不知道它是否相关,但是我注意到的另一件小事是,在电影后期开始进行转码时,音频开始时会有点不同步。 After several seconds, it gets back in sync. 几秒钟后,它又恢复同步。 The audio is in sync in the original. 音频与原始音频同步。

Robert Rowntree: 罗伯特·罗恩特里(Robert Rowntree):

-vcodec libx264 -b:v 200k -bt 50k -threads 0 -b_strategy 1 -acodec copy -f mp4 -strict -2

Interesting. 有趣。 Your command almost works. 您的命令几乎可以正常工作。 The video actually plays on Android. 该视频实际上在Android上播放。 The one problem is that the audio is out-of-sync and stays out-of-sync throughout the whole clip. 一个问题是音频在整个剪辑中都不同步,并且保持不同步。 But, that's much closer than I've been. 但是,这比我做的要紧密得多。 I'll search around there and see if I can find the right combination. 我会在附近搜索,看看是否可以找到合适的组合。

I tried combinations of it. 我尝试了它的组合。 It appears that using both mp4 and copying the audio is what allows it to work. 看起来同时使用mp4和复制音频才可以使其正常工作。 Using libvorbis or going to mkv breaks it again. 使用libvorbis或转到mkv会再次破坏它。 But, I would like to transcode the audio, and I suspect to keep it in sync, I might have to transcode it anyways. 但是,我想对音频进行转码,并且我怀疑是要使其保持同步,所以无论如何我都可能不得不对其进行转码。 Note that even with transcoding, when I play it back on the computer, I still don't have sync between audio and video. 请注意,即使进行了转码,当我在计算机上播放它时,音频和视频之间仍然没有同步。

LordNeckbeard: Here is the complete log. LordNeckbeard:这是完整的日志。

ffmpeg version 1.0.7 Copyright (c) 2000-2013 the FFmpeg developers
  built on Jul 27 2013 13:01:19 with gcc 4.4.5 (Gentoo 4.4.5 p1.2, pie-0.4.5)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --optflags='-mtune=athlon64 -O2 -pipe -fomit-frame-pointer -fstack-protector' --extra-cflags='-mtune=athlon64 -O2 -pipe -fomit-frame-pointer -fstack-protector' --extra-cxxflags='-mtune=athlon64 -O2 -pipe -fomit-frame-pointer -fstack-protector' --disable-static --enable-gpl --enable-version3 --enable-postproc --enable-avfilter --enable-avresample --disable-stripping --disable-debug --disable-doc --disable-vaapi --disable-runtime-cpudetect --enable-libmp3lame --enable-libvo-aacenc --enable-libtheora --enable-libx264 --enable-libxvid --enable-libcaca --enable-openal --disable-indev=v4l2 --disable-indev=oss --disable-indev=jack --enable-x11grab --disable-outdev=oss --enable-libfreetype --enable-pthreads --enable-libspeex --enable-libvorbis --disable-altivec --disable-avx --disable-vis --disable-neon --cpu=athlon64 -  libavutil      51. 73.101 / 51. 73.101
  libavcodec     54. 59.100 / 54. 59.100
  libavformat    54. 29.104 / 54. 29.104
  libavdevice    54.  2.101 / 54.  2.101
  libavfilter     3. 17.100 /  3. 17.100
  libswscale      2.  1.101 /  2.  1.101
  libswresample   0. 15.100 /  0. 15.100
  libpostproc    52.  0.100 / 52.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'in.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    creation_time   : 2013-07-13 02:23:51
    encoder         : HandBrake 0.9.6 2012022800
  Duration: 03:14:01.41, start: 0.000000, bitrate: 2408 kb/s
    Chapter #0.0: start -0.133467, end 648.697411
    Metadata:
      title           : Chapter  1
    Chapter #0.1: start 648.697411, end 1297.345411
    Metadata:
      title           : Chapter  2
    Chapter #0.2: start 1297.345411, end 1729.777411
    Metadata:
      title           : Chapter  3
    Chapter #0.3: start 1729.777411, end 2378.425411
    Metadata:
      title           : Chapter  4
    Chapter #0.4: start 2378.425411, end 3027.073411
    Metadata:
      title           : Chapter  5
    Chapter #0.5: start 3027.073411, end 3675.721411
    Metadata:
      title           : Chapter  6
    Chapter #0.6: start 3675.721411, end 4108.153411
    Metadata:
      title           : Chapter  7
    Chapter #0.7: start 4108.153411, end 4756.801411
    Metadata:
      title           : Chapter  8
    Chapter #0.8: start 4756.801411, end 5405.449411
    Metadata:
      title           : Chapter  9
    Chapter #0.9: start 5405.449411, end 6054.097411
    Metadata:
      title           : Chapter 10
    Chapter #0.10: start 6054.097411, end 6702.745411
    Metadata:
      title           : Chapter 11
    Chapter #0.11: start 6702.745411, end 7135.177411
    Metadata:
      title           : Chapter 12
    Chapter #0.12: start 7135.177411, end 7783.825411
    Metadata:
      title           : Chapter 13
    Chapter #0.13: start 7783.825411, end 8432.473411
    Metadata:
      title           : Chapter 14
    Chapter #0.14: start 8432.473411, end 9081.121411
    Metadata:
      title           : Chapter 15
    Chapter #0.15: start 9081.121411, end 9513.553411
    Metadata:
      title           : Chapter 16
    Chapter #0.16: start 9513.553411, end 10162.201411
    Metadata:
      title           : Chapter 17
    Chapter #0.17: start 10162.201411, end 10810.849411
    Metadata:
      title           : Chapter 18
    Chapter #0.18: start 10810.849411, end 11459.497411
    Metadata:
      title           : Chapter 19
    Chapter #0.19: start 11459.497411, end 11641.412478
    Metadata:
      title           : Chapter 20
    Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 320x240, 2240 kb/s, 29.97 fps, 60 tbr, 90k tbn, 180k tbc
    Metadata:
      creation_time   : 2013-07-13 02:23:51
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48000 Hz, stereo, s16, 162 kb/s
    Metadata:
      creation_time   : 2013-07-13 02:23:51
    Stream #0:2(und): Subtitle: mov_text (text / 0x74786574)
    Metadata:
      creation_time   : 2013-07-13 02:23:51
[libx264 @ 0x14ea220] using cpu capabilities: MMX2 SSE2Slow SlowCTZ
[libx264 @ 0x14ea220] profile High, level 2.1
[libx264 @ 0x14ea220] 264 - core 120 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - 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 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=60 keyint_min=6 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=20.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 vbv_maxrate=400 vbv_bufsize=1835 crf_max=0.0 nal_hrd=none ip_ratio=1.40 aq=1:1.00
Output #0, matroska, to 'out.mkv':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42isomavc1
    encoder         : Lavf54.29.104
    Chapter #0.0: start 0.000000, end 60.000000
    Metadata:
      title           : Chapter  1
    Stream #0:0(und): Video: h264 (H264 / 0x34363248), yuv420p, 320x240, q=-1--1, 1k tbn, 60 tbc
    Metadata:
      creation_time   : 2013-07-13 02:23:51
    Stream #0:1(und): Audio: vorbis (oV[0][0] / 0x566F), 48000 Hz, stereo, flt
    Metadata:
      creation_time   : 2013-07-13 02:23:51
Stream mapping:
  Stream #0:0 -> #0:0 (h264 -> libx264)
  Stream #0:1 -> #0:1 (aac -> libvorbis)
Press [q] to stop, [?] for help
frame= 1799 fps= 92 q=-1.0 Lsize=    3738kB time=00:00:59.98 bitrate= 510.5kbits/s dup=0 drop=51    =51    
video:3016kB audio:683kB subtitle:0 global headers:4kB muxing overhead 0.939943%
[libx264 @ 0x14ea220] frame I:31    Avg QP:20.23  size: 14126
[libx264 @ 0x14ea220] frame P:634   Avg QP:23.03  size:  3317
[libx264 @ 0x14ea220] frame B:1134  Avg QP:27.71  size:   482
[libx264 @ 0x14ea220] consecutive B-frames:  2.3% 12.8% 84.7%  0.2%
[libx264 @ 0x14ea220] mb I  I16..4:  3.8% 63.8% 32.4%
[libx264 @ 0x14ea220] mb P  I16..4:  0.1%  0.3%  0.1%  P16..4: 47.4% 30.2% 19.5%  0.0%  0.0%    skip: 2.4%
[libx264 @ 0x14ea220] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8: 35.2%  3.0%  0.6%  direct: 8.8%  skip:52.3%  L0:28.7% L1:63.9% BI: 7.4%
[libx264 @ 0x14ea220] 8x8 transform intra:64.0% inter:59.5%
[libx264 @ 0x14ea220] coded y,uvDC,uvAC intra: 94.2% 99.5% 95.5% inter: 23.3% 55.5% 14.0%
[libx264 @ 0x14ea220] i16 v,h,dc,p: 75% 10%  5% 10%
[libx264 @ 0x14ea220] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 19% 16% 12%  8%  7%  8%  8% 11% 11%
[libx264 @ 0x14ea220] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 17% 20%  7%  8%  9%  9% 10% 10% 11%
[libx264 @ 0x14ea220] i8c dc,h,v,p: 38% 31% 14% 17%
[libx264 @ 0x14ea220] Weighted P-Frames: Y:7.3% UV:4.4%
[libx264 @ 0x14ea220] ref P L0: 48.8% 14.2% 29.1%  7.5%  0.4%
[libx264 @ 0x14ea220] ref B L0: 65.4% 30.8%  3.7%
[libx264 @ 0x14ea220] ref B L1: 89.0% 11.0%
[libx264 @ 0x14ea220] kb/s:411.70

Upgrading to ffmpeg 1.2.1 fixed the compatibility issue. 升级到ffmpeg 1.2.1解决了兼容性问题。 After that, my Android phone was able to play the videos just fine. 之后,我的Android手机可以正常播放视频了。

The -ss option is trickier than it at first looks. -ss选项比乍一看要棘手。 It has a different meaning based on whether it is before or after -i. 根据它在-i之前还是之后,它具有不同的含义。 It turns out, to make it work, you have to use both. 事实证明,要使其工作,您必须同时使用两者。 You put the main offset before -i, which makes ffmpeg skip to that point in the stream. 您将主偏移量放在-i之前,这使ffmpeg跳到流中的该点。 But, then you also need a small non-zero offset AFTER -i to make it seek to that point within the stream so audio and video will be in sync. 但是,然后您还需要一个较小的非零偏移量AFTER -i,使其在流中搜索到该点,以便音频和视频保持同步。

For reference, the final working command is: 供参考,最后的工作命令是:

ffmpeg -ss 00:03:52.00 -i in.mp4 -ss 0.1 -t 01:28:33.00 -c:v libx264 -preset medium -crf 20 -maxrate 400k -bufsize 1835k -c:a libvorbis -sn out.mkv

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM