使用 ffmpeg 转换时如何从视频中删除“写入库”和“编码设置”?

使用 ffmpeg 转换时如何从视频中删除“写入库”和“编码设置”?

当我使用这个命令时:

C:\Windows\bin\ffmpeg.exe -y -i f:\1.flv -vcodec h264 -s 1280x720 -acodec copy f:\output.mp4

视频输出.mp4信息:

General
Complete name                    : F:\output.mp4
Format                           : MPEG-4
Format profile                   : Base Media
Codec ID                         : isom
File size                        : 129 MiB
Duration                         : 10mn 15s
Overall bit rate                 : 1 759 Kbps
Writing application              : Lavf57.14.100

Video
ID                               : 1
Format                           : AVC
Format/Info                      : Advanced Video Codec
Format profile                   : [email protected]
Format settings, CABAC           : Yes
Format settings, ReFrames        : 4 frames
Format settings, GOP             : M=4, N=45
Codec ID                         : avc1
Codec ID/Info                    : Advanced Video Coding
Duration                         : 10mn 15s
Bit rate mode                    : Variable
Bit rate                         : 1 624 Kbps
Width                            : 1 280 pixels
Height                           : 720 pixels
Display aspect ratio             : 16:9
Frame rate mode                  : Constant
Frame rate                       : 25.000 fps
Color space                      : YUV
Chroma subsampling               : 4:2:0
Bit depth                        : 8 bits
Scan type                        : Progressive
Bits/(Pixel*Frame)               : 0.071
Stream size                      : 119 MiB (92%)
Writing library                  : x264 core 148 r2638 7599210
Encoding settings                : 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=12 / lookahead_threads=2 / 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

Audio
ID                               : 2
Format                           : AAC
Format/Info                      : Advanced Audio Codec
Format profile                   : LC
Codec ID                         : 40
Duration                         : 10mn 15s
Bit rate mode                    : Constant
Bit rate                         : 128 Kbps
Channel(s)                       : 2 channels
Channel positions                : Front: L R
Sampling rate                    : 44.1 KHz
Compression mode                 : Lossy
Stream size                      : 9.38 MiB (7%)

所以我想删除“写作库”和“编码设置”,怎么做?

答案1

可以通过输入以下命令来实现:-x265-params no-info=1

例如:

ffmpeg -i input.mkv -c:v libx265 -b:v 4000k -an -x265-params no-info=1 output.hevc

答案2

对于 AVC:

ffmpeg -i INPUT -bsf:v 'filter_units=remove_types=6' -c copy OUTPUT

对于 HEVC 来说,情况更为复杂,因为 ffmpeg 不会因为某种原因直接将其删除:

ffmpeg -i INPUT -c:v copy -bsf hevc_mp4toannexb source-video.hevc
ffmpeg -i source-video.hevc -i INPUT -map 0 -map 1:a -bsf:v 'filter_units=remove_types=39' -c copy OUTPUT

答案3

事实证明,“写入库”和“编码设置”都只是文件开头附近的一个 ASCII 字符串。这是我编写的一个简单的 perl 脚本,用于用空格覆盖字符串,而保留文件其余内容。虽然很粗糙,而且测试有限,但显然很有效。使用时风险自负。

#!/usr/bin/perl
use strict;
use Fcntl qw(SEEK_SET);
my $file = $ARGV[0];
open(my $fh, "+<:raw", $file) or die "$file: open: $!";
my $len = sysread($fh, my $buf, 102400);
die "$file: read: $!" if !defined($len);
die "$file: Too short." if ($len < 1000);
die "$file: No x264/5 parameters found." unless $buf =~ /(?:x265 \(build|x264 [ -]*core) [ -~]{30,}/;
sysseek($fh, $-[0],SEEK_SET) or die "$file: seek: $!";
$len = syswrite($fh, ' ' x ($+[0] - $-[0]));
die "$file: write: $!" if !defined($len);
$len -= $+[0] - $-[0];
die "$file: Failed to fully overwrite ($len bytes short)." if ($len > 0);

放入一个名为“x264-265-decomment.pl”的文件,并使用您要修改的一个文件的名称运行它,例如,

x264-265-decomment.pl video.mkv

答案4

对“For Fun”的回答补充解释:

AVC 流使用 NAL 单元进行分组,比特流过滤器filter_units会移除/传递特定的 NAL 类型。在这种情况下,我们要过滤掉的 NAL 单元是Supplemental enhancement information (SEI)H.264 规范表 7-1 中类型 6 的单元。

相关内容