Конвертация ffmpeg: Twitter отклоняет видео с «Неправильным видео» - PullRequest
2 голосов
/ 12 февраля 2020

У меня есть приложение, которое загружает через твиттер api chunked upload, и оно наконец работает с фотографиями.

Однако я пытаюсь заставить его работать с видео.

Загрузка не работает из коробки, хотя формат видео - mp4. Рекомендации по загрузке в Twitter: эти

Имея это в виду, у меня пока есть команда ffmpeg:

ffmpeg -i in.mp4  -vf \"scale=1280:720\" -b:v 5000K -minrate 5000K -maxrate 5000K -b:a 128K -r 30 -f mp4 -vcodec libx264 -profile:v high -pix_fmt yuv420p -strict -2  -ac 2 -acodec aac out.mp4

Я все еще получаю "Неправильное видео", и я не знаю почему.

Вот мой вывод mediainfo для out.mp4:

General
Count                                    : 328
Count of stream of this kind             : 1
Kind of stream                           : General
Kind of stream                           : General
Stream identifier                        : 0
Count of video streams                   : 1
Count of audio streams                   : 1
Video_Format_List                        : AVC
Video_Format_WithHint_List               : AVC
Codecs Video                             : AVC
Video_Language_List                      : English
Audio_Format_List                        : AAC
Audio_Format_WithHint_List               : AAC
Audio codecs                             : AAC LC
Audio_Language_List                      : English
Complete name                            : video-5e4405cd4348a5e4405cd434d2.mp4
File name                                : video-5e4405cd4348a5e4405cd434d2
File extension                           : mp4
Format                                   : MPEG-4
Format                                   : MPEG-4
Format/Extensions usually used           : mov mp4 m4v m4a m4b m4p 3ga 3gpa 3gpp 3gp 3gpp2 3g2 k3g jpm jpx mqv ismv isma ismt f4a f4b f4v
Commercial name                          : MPEG-4
Format profile                           : Base Media
Internet media type                      : video/mp4
Codec ID                                 : isom
Codec ID                                 : isom (isom/iso2/avc1/mp41)
Codec ID/Url                             : http://www.apple.com/quicktime/download/standalone.html
CodecID_Compatible                       : isom/iso2/avc1/mp41
Codec                                    : MPEG-4
Codec                                    : MPEG-4
Codec/Extensions usually used            : mov mp4 m4v m4a m4b m4p 3ga 3gpa 3gpp 3gp 3gpp2 3g2 k3g jpm jpx mqv ismv isma ismt f4a f4b f4v
File size                                : 52664272
File size                                : 50.2 MiB
File size                                : 50 MiB
File size                                : 50 MiB
File size                                : 50.2 MiB
File size                                : 50.22 MiB
Duration                                 : 79744
Duration                                 : 1 min 19 s
Duration                                 : 1 min 19 s 744 ms
Duration                                 : 1 min 19 s
Duration                                 : 00:01:19.744
Duration                                 : 00:01:19:20
Duration                                 : 00:01:19.744 (00:01:19:20)
Overall bit rate                         : 5283334
Overall bit rate                         : 5 283 kb/s
Frame rate                               : 30.000
Frame rate                               : 30.000 FPS
Frame count                              : 2390
Stream size                              : 88780
Stream size                              : 86.7 KiB (0%)
Stream size                              : 87 KiB
Stream size                              : 87 KiB
Stream size                              : 86.7 KiB
Stream size                              : 86.70 KiB
Stream size                              : 86.7 KiB (0%)
Proportion of this stream                : 0.00169
HeaderSize                               : 40
DataSize                                 : 52575500
FooterSize                               : 88732
IsStreamable                             : No
File last modification date              : UTC 2020-02-12 14:05:37
File last modification date (local)      : 2020-02-12 15:05:37
Writing application                      : Lavf57.83.100
Writing application                      : Lavf57.83.100

Video
Count                                    : 342
Count of stream of this kind             : 1
Kind of stream                           : Video
Kind of stream                           : Video
Stream identifier                        : 0
StreamOrder                              : 0
ID                                       : 1
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format/Url                               : http://developers.videolan.org/x264.html
Commercial name                          : AVC
Format profile                           : High@L3.1
Format settings                          : CABAC / 4 Ref Frames
Format settings, CABAC                   : Yes
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 4
Format settings, ReFrames                : 4 frames
Internet media type                      : video/H264
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Codec                                    : AVC
Codec                                    : AVC
Codec/Family                             : AVC
Codec/Info                               : Advanced Video Codec
Codec/Url                                : http://developers.videolan.org/x264.html
Codec/CC                                 : avc1
Codec profile                            : High@L3.1
Codec settings                           : CABAC / 4 Ref Frames
Codec settings, CABAC                    : Yes
Codec_Settings_RefFrames                 : 4
Duration                                 : 79667
Duration                                 : 1 min 19 s
Duration                                 : 1 min 19 s 667 ms
Duration                                 : 1 min 19 s
Duration                                 : 00:01:19.667
Duration                                 : 00:01:19:20
Duration                                 : 00:01:19.667 (00:01:19:20)
Bit rate                                 : 5000000
Bit rate                                 : 5 000 kb/s
Width                                    : 1280
Width                                    : 1 280 pixels
Height                                   : 720
Height                                   : 720 pixels
Sampled_Width                            : 1280
Sampled_Height                           : 720
Pixel aspect ratio                       : 1.000
Display aspect ratio                     : 1.778
Display aspect ratio                     : 16:9
Rotation                                 : 0.000
Frame rate mode                          : CFR
Frame rate mode                          : Constant
FrameRate_Mode_Original                  : VFR
Frame rate                               : 30.000
Frame rate                               : 30.000 FPS
Frame count                              : 2390
Resolution                               : 8
Resolution                               : 8 bits
Colorimetry                              : 4:2:0
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Chroma subsampling                       : 4:2:0
Bit depth                                : 8
Bit depth                                : 8 bits
Scan type                                : Progressive
Scan type                                : Progressive
Interlacement                            : PPF
Interlacement                            : Progressive
Bits/(Pixel*Frame)                       : 0.181
Stream size                              : 51297022
Stream size                              : 48.9 MiB (97%)
Stream size                              : 49 MiB
Stream size                              : 49 MiB
Stream size                              : 48.9 MiB
Stream size                              : 48.92 MiB
Stream size                              : 48.9 MiB (97%)
Proportion of this stream                : 0.97404
Writing library                          : x264 - core 152 r2854 e9a5903
Writing library                          : x264 core 152 r2854 e9a5903
Encoded_Library_Name                     : x264
Encoded_Library_Version                  : core 152 r2854 e9a5903
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=abr / mbtree=1 / bitrate=5000 / ratetol=1.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00
Language                                 : en
Language                                 : English
Language                                 : English
Language                                 : en
Language                                 : eng
Language                                 : en

Audio
Count                                    : 275
Count of stream of this kind             : 1
Kind of stream                           : Audio
Kind of stream                           : Audio
Stream identifier                        : 0
StreamOrder                              : 1
ID                                       : 2
ID                                       : 2
Format                                   : AAC
Format/Info                              : Advanced Audio Codec
Commercial name                          : AAC
Format profile                           : LC
Format settings, SBR                     : No (Explicit)
Format settings, SBR                     : No (Explicit)
Codec ID                                 : mp4a-40-2
Codec                                    : AAC LC
Codec                                    : AAC LC
Codec/Family                             : AAC
Codec/CC                                 : 40
Duration                                 : 79744
Duration                                 : 1 min 19 s
Duration                                 : 1 min 19 s 744 ms
Duration                                 : 1 min 19 s
Duration                                 : 00:01:19.744
Duration                                 : 00:01:19:25
Duration                                 : 00:01:19.744 (00:01:19:25)
Bit rate mode                            : CBR
Bit rate mode                            : Constant
Bit rate                                 : 128257
Bit rate                                 : 128 kb/s
Channel(s)                               : 2
Channel(s)                               : 2 channels
Channel positions                        : Front: L R
Channel positions                        : 2/0/0
ChannelLayout                            : L R
Samples per frame                        : 1024
Sampling rate                            : 48000
Sampling rate                            : 48.0 kHz
Samples count                            : 3827712
Frame rate                               : 46.875
Frame rate                               : 46.875 FPS (1024 SPF)
Frame count                              : 3738
Compression mode                         : Lossy
Compression mode                         : Lossy
Stream size                              : 1278470
Stream size                              : 1.22 MiB (2%)
Stream size                              : 1 MiB
Stream size                              : 1.2 MiB
Stream size                              : 1.22 MiB
Stream size                              : 1.219 MiB
Stream size                              : 1.22 MiB (2%)
Proportion of this stream                : 0.02428
Language                                 : en
Language                                 : English
Language                                 : English
Language                                 : en
Language                                 : eng
Language                                 : en
Default                                  : Yes
Default                                  : Yes
Alternate group                          : 1
Alternate group                          : 1



Редактировать: Думаю, я тоже добавлю свой код PHP (Это прерывается в разумном из-за того, что сам файл очень большой):



// Set up Codebird
\Codebird\Codebird::setConsumerKey($consumer_key, $consumer_secret); // static, see README

$cb = \Codebird\Codebird::getInstance();

$cb->setToken($token, $token_secret);
$cb->setTimeout(60 * 1000); // 60 second request timeout

  $video = new Video($path);

    // Convert to the parameter required by twitter.
    $converted = $video->convert();

    $path = realpath('videos/' . $converted);

    $file = fopen($path, 'rb');

    $size = fstat($file)['size'];
    $mime_type = mime_content_type($path);

    $media = $cb->media_upload([
      'command' => 'INIT',
      'media_type' => $mime_type,
    'media_category' => 'tweet_video',
      'total_bytes' => $size,
    ]);

$success = $media->httpstatus >= 200 && $media->httpstatus < 300; # 2xx

  if (!$success) {
    throw new TwitterException("Failed to INIT upload for $path...");
  }


  // APPEND chunks to upload.
  $mediaId = $media->media_id_string;
  $segmentId = 0;

  while (!feof($file)) {
    echo "chunk #$segmentId....";

    $chunk = fread($file, 512 * 1024); // caps out at 512 MB

    echo "chunk size: ". strlen($chunk);

    $media = $cb->media_upload([
      'command' => 'APPEND',
      'media_id' => $mediaId,
      'segment_index' => $segmentId,
      'media' => $chunk,
    ]);

    $success = $media->httpstatus >= 200 && $media->httpstatus < 300; # 2xx

    if (!$success) {
      throw new TwitterException("Failed to APPEND to upload for $path, chunk $segmentId...");
    }

    $segmentId++;
  }
  // Close file and FINALIZE upload.
  fclose($file);

echo "FINALIZING id $mediaId...";
  $media = $cb->media_upload([
      'command' => 'FINALIZE',
      'media_id' => $mediaId,
  ]);

  $success = $media->httpstatus >= 200 && $media->httpstatus < 300; # 2xx

  if (!$success) {
    var_dump($media);
    throw new TwitterException("Failed to FINALIZE upload for $path...");
  }

  return $mediaId;

Видео - это мой класс ffmpeg, который я вставлю ниже, а $ path - это URL, ведущий к совершенно корректному видео в формате mp4.

Видео. php:

<?php

class VideoConversionException extends \Exception {}

class Video {
  public $name;
  public $converted;


  public function __construct($name) {
    self::clear();

    $this->name = $name;
  }


  public function convert() {
    $tmpVideo = 'video-' . uniqid() . uniqid() . '.mp4';
    $videoPath = 'videos/' . $tmpVideo;

    //$ffmpeg = "ffmpeg -i https://tvcanarias.acfipress.com/BC_190907_gc_teror.mp4  -vf "scale=1280:720" -b:v 5000K -b:a 128K -r 30 -f mp4 -vcodec libx264 -acodec aac output_video.mp4";
    $ffmpeg = "ffmpeg -i {$this->name}  -vf \"scale=1280:720\" -b:v 5000K -minrate 5000K -maxrate 5000K -b:a 128K -r 30 -f mp4 -vcodec libx264 -profile:v high -pix_fmt yuv420p -strict -2  -ac 2 -acodec aac $videoPath";
    //$ffmpeg = "ffmpeg -i {$this->name} -pix_fmt yuv420p -vcodec libx264 -vf scale=640:-1 -acodec aac -vb 1024k -minrate 1024k -maxrate 1024k -bufsize 1024k -ar 44100  -ac 2  -strict experimental -r 30 $videoPath";
    $output = [];
    exec($ffmpeg, $output, $status);

    if ($status != 0) {
      //die("Couldnt run ffmpeg. (Error code: #$status)");
      throw new VideoConversionException("Couldn't run ffmpeg. (Error code: #$status)");
    }

    $this->converted = $tmpVideo;
    return $tmpVideo;
  }

  public function shredConverted() {
    // delete video.
    @unlink("videos/{$this->$converted}");
  }

  public static function clear() {
    // We can't really shred videos right away as they might be still uploading.
    // Therefore, every time this library is used, we will just delete videos older
    // than, say, an hour.

    $files = scandir('videos');

    $curtime = time();

    foreach ($files as $file) {
      if ($file == '.gitignore' || $file == '.' || $file == '..') {
        continue;
      }

      $mtime = filemtime("videos/$file");

      $diff = $curtime - $mtime;
      $overAnHour = $diff > (60 * 60);

      if ($overAnHour) {
        @unlink("videos/$file");
      }
    }
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...