[FFmpeg-user] How to call ffmpeg code without quality loss for video conversion?

seaguest tyhk1987 at gmail.com
Tue May 10 06:48:16 CEST 2016


Hello,

Here is the source probe information:

$ ffprobe mv.webm
ffprobe version N-79826-g64fd62d Copyright (c) 2007-2016 the FFmpeg 
developers
   built with gcc 5.3.1 (Ubuntu 5.3.1-14ubuntu2) 20160413
   configuration: --prefix=/home/seaguest/ffmpeg_build 
--pkg-config-flags=--static 
--extra-cflags=-I/home/seaguest/ffmpeg_build/include 
--extra-ldflags=-L/home/seaguest/ffmpeg_build/lib --enable-gpl 
--enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-nonfree
   libavutil      55. 24.100 / 55. 24.100
   libavcodec     57. 39.100 / 57. 39.100
   libavformat    57. 36.100 / 57. 36.100
   libavdevice    57.  0.101 / 57.  0.101
   libavfilter     6. 45.100 /  6. 45.100
   libswscale      4.  1.100 /  4.  1.100
   libswresample   2.  0.101 /  2.  0.101
   libpostproc    54.  0.100 / 54.  0.100
Input #0, matroska,webm, from 'mv.webm':
   Metadata:
     encoder         : Lavf57.36.100
   Duration: 00:00:30.00, start: 0.000000, bitrate: 935 kb/s
     Stream #0:0: Video: vp8, yuv420p, 640x480, SAR 1:1 DAR 4:3, 25 fps, 
25 tbr, 1k tbn (default)
     Stream #0:1: Audio: vorbis, 44100 Hz, stereo, fltp (default)


I checked the log printed by command line mode and calling code mode, 
the setting looks like the same, here are the logs:

$ ffmpeg -i mv.webm -c:a aac -c:v libx264  mv.mp4
ffmpeg version N-79826-g64fd62d Copyright (c) 2000-2016 the FFmpeg 
developers
   built with gcc 5.3.1 (Ubuntu 5.3.1-14ubuntu2) 20160413
   configuration: --prefix=/home/seaguest/ffmpeg_build 
--pkg-config-flags=--static 
--extra-cflags=-I/home/seaguest/ffmpeg_build/include 
--extra-ldflags=-L/home/seaguest/ffmpeg_build/lib --enable-gpl 
--enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-nonfree
   libavutil      55. 24.100 / 55. 24.100
   libavcodec     57. 39.100 / 57. 39.100
   libavformat    57. 36.100 / 57. 36.100
   libavdevice    57.  0.101 / 57.  0.101
   libavfilter     6. 45.100 /  6. 45.100
   libswscale      4.  1.100 /  4.  1.100
   libswresample   2.  0.101 /  2.  0.101
   libpostproc    54.  0.100 / 54.  0.100
Input #0, matroska,webm, from 'mv.webm':
   Metadata:
     encoder         : Lavf57.36.100
   Duration: 00:00:30.00, start: 0.000000, bitrate: 935 kb/s
     Stream #0:0: Video: vp8, yuv420p, 640x480, SAR 1:1 DAR 4:3, 25 fps, 
25 tbr, 1k tbn (default)
     Stream #0:1: Audio: vorbis, 44100 Hz, stereo, fltp (default)
[libx264 @ 0x3e5d880] using SAR=1/1
[libx264 @ 0x3e5d880] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 
AVX FMA3 AVX2 LZCNT BMI2
[libx264 @ 0x3e5d880] profile High, level 3.0
[libx264 @ 0x3e5d880] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC 
codec - Copyleft 2003-2015 - 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=6 
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 @ 0x3e2f680] Using AVStream.codec to pass codec parameters to 
muxers is deprecated, use AVStream.codecpar instead.
     Last message repeated 1 times
Output #0, mp4, to 'mv.mp4':
   Metadata:
     encoder         : Lavf57.36.100
     Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 640x480 
[SAR 1:1 DAR 4:3], q=2-31, 25 fps, 12800 tbn (default)
     Metadata:
       encoder         : Lavc57.39.100 libx264
     Side data:
       cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
     Stream #0:1: Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz, 
stereo, fltp, 128 kb/s (default)
     Metadata:
       encoder         : Lavc57.39.100 aac
Stream mapping:
   Stream #0:0 -> #0:0 (vp8 (native) -> h264 (libx264))
   Stream #0:1 -> #0:1 (vorbis (native) -> aac (native))
Press [q] to stop, [?] for help
frame=  750 fps=229 q=-1.0 Lsize=    2508kB time=00:00:30.02 bitrate= 
684.5kbits/s speed=9.17x
video:2023kB audio:459kB subtitle:0kB other streams:0kB global 
headers:0kB muxing overhead: 1.052857%
[libx264 @ 0x3e5d880] frame I:11    Avg QP:15.29  size: 20395
[libx264 @ 0x3e5d880] frame P:345   Avg QP:20.93  size:  4350
[libx264 @ 0x3e5d880] frame B:394   Avg QP:23.55  size:   879
[libx264 @ 0x3e5d880] consecutive B-frames: 25.2%  3.2% 33.2% 38.4%
[libx264 @ 0x3e5d880] mb I  I16..4: 44.1% 32.5% 23.4%
[libx264 @ 0x3e5d880] mb P  I16..4:  1.5%  3.6%  0.6%  P16..4: 28.9% 
11.2%  4.7%  0.0%  0.0%    skip:49.5%
[libx264 @ 0x3e5d880] mb B  I16..4:  0.0%  0.1%  0.0%  B16..8: 27.4%  
2.0%  0.4%  direct: 0.8%  skip:69.3%  L0:40.0% L1:53.3% BI: 6.7%
[libx264 @ 0x3e5d880] 8x8 transform intra:52.6% inter:74.9%
[libx264 @ 0x3e5d880] coded y,uvDC,uvAC intra: 57.5% 68.6% 35.9% inter: 
10.6% 11.9% 2.6%
[libx264 @ 0x3e5d880] i16 v,h,dc,p: 36% 42%  7% 15%
[libx264 @ 0x3e5d880] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 23% 15% 6%  7%  
7% 10%  7% 10%
[libx264 @ 0x3e5d880] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 20% 27% 14% 6%  8%  
7%  7%  6%  6%
[libx264 @ 0x3e5d880] i8c dc,h,v,p: 46% 34% 11%  9%
[libx264 @ 0x3e5d880] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x3e5d880] ref P L0: 63.9% 20.8% 11.2%  4.1%
[libx264 @ 0x3e5d880] ref B L0: 93.1%  6.1%  0.8%
[libx264 @ 0x3e5d880] ref B L1: 95.8%  4.2%
[libx264 @ 0x3e5d880] kb/s:552.32
[aac @ 0x3e5ec00] Qavg: 3030.804


$ ffprobe mv.mp4
ffprobe version N-79826-g64fd62d Copyright (c) 2007-2016 the FFmpeg 
developers
   built with gcc 5.3.1 (Ubuntu 5.3.1-14ubuntu2) 20160413
   configuration: --prefix=/home/seaguest/ffmpeg_build 
--pkg-config-flags=--static 
--extra-cflags=-I/home/seaguest/ffmpeg_build/include 
--extra-ldflags=-L/home/seaguest/ffmpeg_build/lib --enable-gpl 
--enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-nonfree
   libavutil      55. 24.100 / 55. 24.100
   libavcodec     57. 39.100 / 57. 39.100
   libavformat    57. 36.100 / 57. 36.100
   libavdevice    57.  0.101 / 57.  0.101
   libavfilter     6. 45.100 /  6. 45.100
   libswscale      4.  1.100 /  4.  1.100
   libswresample   2.  0.101 /  2.  0.101
   libpostproc    54.  0.100 / 54.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'mv.mp4':
   Metadata:
     major_brand     : isom
     minor_version   : 512
     compatible_brands: isomiso2avc1mp41
     encoder         : Lavf57.36.100
   Duration: 00:00:30.01, start: 0.000000, bitrate: 684 kb/s
     Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
640x480 [SAR 1:1 DAR 4:3], 552 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
     Metadata:
       handler_name    : VideoHandler
     Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, 
stereo, fltp, 125 kb/s (default)
     Metadata:
       handler_name    : SoundHandler


For the calling code mode:

$ go run transcode.go mv.webm mv1.mp4
# github.com/3d0c/gmf
../packet.go: In function ‘_cgo_3c42eeb63b1e_Cfunc_avcodec_decode_audio4’:
../packet.go:87:2: warning: ‘avcodec_decode_audio4’ is deprecated 
[-Wdeprecated-declarations]
  func (this *Packet) decode(cc *CodecCtx, frame *Frame) (*Frame, bool, 
int, error) {
   ^
In file included from ../packet.go:7:0:
/home/seaguest/ffmpeg_build/include/libavcodec/avcodec.h:4685:5: note: 
declared here
  int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame,
      ^
../packet.go: In function ‘_cgo_3c42eeb63b1e_Cfunc_avcodec_decode_video2’:
../packet.go:104:2: warning: ‘avcodec_decode_video2’ is deprecated 
[-Wdeprecated-declarations]
    }
   ^
In file included from ../packet.go:7:0:
/home/seaguest/ffmpeg_build/include/libavcodec/avcodec.h:4734:5: note: 
declared here
  int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
      ^
[libx264 @ 0x2d82400] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 
AVX FMA3 AVX2 LZCNT BMI2
[libx264 @ 0x2d82400] profile High, level 3.0
[libx264 @ 0x2d82400] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC 
codec - Copyleft 2003-2015 - 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=6 
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 @ 0x2d480c0] Using AVStream.codec.time_base as a timebase hint to 
the muxer is deprecated. Set AVStream.time_base instead.
[mp4 @ 0x2d480c0] Using AVStream.codec to pass codec parameters to 
muxers is deprecated, use AVStream.codecpar instead.
[mp4 @ 0x2d480c0] Using AVStream.codec.time_base as a timebase hint to 
the muxer is deprecated. Set AVStream.time_base instead.
[mp4 @ 0x2d480c0] Using AVStream.codec to pass codec parameters to 
muxers is deprecated, use AVStream.codecpar instead.



$ ffprobe mv1.mp4
ffprobe version N-79826-g64fd62d Copyright (c) 2007-2016 the FFmpeg 
developers
   built with gcc 5.3.1 (Ubuntu 5.3.1-14ubuntu2) 20160413
   configuration: --prefix=/home/seaguest/ffmpeg_build 
--pkg-config-flags=--static 
--extra-cflags=-I/home/seaguest/ffmpeg_build/include 
--extra-ldflags=-L/home/seaguest/ffmpeg_build/lib --enable-gpl 
--enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-nonfree
   libavutil      55. 24.100 / 55. 24.100
   libavcodec     57. 39.100 / 57. 39.100
   libavformat    57. 36.100 / 57. 36.100
   libavdevice    57.  0.101 / 57.  0.101
   libavfilter     6. 45.100 /  6. 45.100
   libswscale      4.  1.100 /  4.  1.100
   libswresample   2.  0.101 /  2.  0.101
   libpostproc    54.  0.100 / 54.  0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'mv1.mp4':
   Metadata:
     major_brand     : isom
     minor_version   : 512
     compatible_brands: isomiso2avc1mp41
     encoder         : Lavf57.36.100
   Duration: 00:00:30.00, start: 0.000000, bitrate: 751 kb/s
     Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 
640x480, 613 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
     Metadata:
       handler_name    : VideoHandler
     Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, 
stereo, fltp, 130 kb/s (default)
     Metadata:
       handler_name    : SoundHandler


  Checking the setting section, crf=23.0 for both (the rest are exactly 
the same), but the output bitrate are different (the audio for calling 
code mode has a lot of noises), how is possible?
  Why the command line mode and calling code mode with same setting, but 
have different output?

  best regards

  Yongkan


On 05/09/2016 08:41 PM, Moritz Barsnick wrote:
> On Mon, May 09, 2016 at 20:11:09 +0800, seaguest wrote:
>> My first question is how are the bitrates of audio/video determined in
>> case they are not specified in command line?
> I think it's documented, but I'll just try to summarize:
> - audio bitrate ("-b:a", formerly "-ab") defaults to 128k
> - libx264 defaults to variable bitrate with a constant rate factor
>    ("-crf") of 23, and using the "medium" preset ("-preset").
>
>> Second question, In the way of calling ffmpeg code, how should I set the
>> AVCodecContext properly to make sure that I have same setting as above
>> command line?
> Questions regarding the use of ffmpeg's libraries belong on the
> libav-user list. But that's just my way of saying "I have no idea", but
> perhaps someone else on this list can help anyway.
>
>> Because I am having an audio quality loss problem when I call the ffmpeg
>> library, whilst the command line works fine.
> That always depends on your inputs of course. But if that is the case,
> the best way is usually to increase the bitrate, as you probably
> figured. The actual bitrate used could be seen in your ffprobe and in
> your conversion commands.
>
> HTH,
> Moritz
> _______________________________________________
> ffmpeg-user mailing list
> ffmpeg-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-user
>
> To unsubscribe, visit link above, or email
> ffmpeg-user-request at ffmpeg.org with subject "unsubscribe".



More information about the ffmpeg-user mailing list