बैच H.265 mkv को H.264 में ffmpeg के साथ पुन: एन्कोडिंग के लिए फाइलों को संगत बनाने के लिए परिवर्तित करते हैं


31

मेरे पास H.265 एन्कोडेड फाइलें हैं जो इतनी संसाधन गहन हैं कि वे अच्छी तरह से नहीं खेलती हैं और मेरा रूपांतरण सॉफ्टवेयर (mencoder) H.265 प्रारूप का समर्थन नहीं करता है (वर्तमान में)। क्या मैं उन्हें कमांड लाइन बैच फ़ाइल में H.264 में तेजी से परिवर्तित कर सकता हूं ताकि Devede / OGMrip का उपयोग करके पुन: संपीड़न के लिए फाइलों को तेजी से परिवर्तित किया जा सके? इस साइट को खोजने पर मुझे इसकी चर्चा नहीं मिली इसलिए मैं पोस्ट करूँगा कि मुझे क्या लगता है कि यह एक उपयोगी प्रश्न है और प्रश्न का उत्तर है।

जवाबों:


37

हाँ, का उपयोग कर ffmpeg

एक टर्मिनल खोलें और इसे H.265 एन्कोडेड फ़ाइलों वाली निर्देशिका में निर्देशित करें, यह मानते हुए कि आपके पास ffmpegऔर उपयुक्त लाइब्रेरी स्थापित हैं और मान लें कि वे एमकेवी प्रारूप कॉपी में हैं और टर्मिनल विंडो में निम्नलिखित पेस्ट करें।

INPUT="$1"
for i in *.mkv ; do
    ffmpeg -i "$i" -bsf:v h264_mp4toannexb -sn -map 0:0 -map 0:1 -vcodec libx264 "$i.ts"
    mv "$i.ts" "$i.mpg"
    sleep 3
done

ये लो। यह एक ही निर्देशिका में एक MPG कंटेनर में h.264 में परिवर्तित हो जाएगा।

कमांड स्विच की व्याख्या:

  • for i in *.mkv ; do ... done

    यह बैच प्रक्रिया में शामिल करने के लिए निर्देशिका में सभी .mkv फ़ाइलों को सेट करता है। इसे उन फ़ाइलों के कंटेनर एक्सटेंशन को समायोजित करने के लिए बदला जा सकता है जिन्हें आप संसाधित करना चाहते हैं।

  • ffmpeg -i "$i" प्रोग्राम ffmpeg को निष्पादित करता है और संसाधित होने वाली फ़ाइलों के लिए कॉल करता है।

    • -bsf:v उपयोग किए जाने वाले वीडियो बिट स्ट्रीम फ़िल्टर को सक्रिय करता है।

    • h264_mp4toannexb - बिट स्ट्रीम फिल्टर सक्रिय है।

      कोड उपसर्ग मोड शुरू करने के लिए लंबाई उपसर्ग मोड से H.264 बिटस्ट्रीम में कनवर्ट करें (जैसा कि ITU-T H.264 विनिर्देशन के अनुलग्नक बी में परिभाषित किया गया है)।

      यह कुछ स्ट्रीमिंग प्रारूपों के लिए आवश्यक है, आमतौर पर MPEG-2 परिवहन स्ट्रीम प्रारूप ( mpegts) प्रसंस्करण MKV h.264 (वर्तमान में) को इसकी आवश्यकता होती है, अगर इसे शामिल नहीं किया गया है तो आपको टर्मिनल विंडो में एक त्रुटि मिलेगी जो आपको इसका उपयोग करने का निर्देश देती है।

    • -sn उपशीर्षक धाराओं की स्ट्रीमिंग को रोक देता है (उन लोगों के लिए जो अपने वीडियो में उपशीर्षक नहीं चाहते हैं) यह वैकल्पिक है और इसे हटाया जा सकता है।

    • -map 0:0 -map 0:1फाइल के पहले दो स्ट्रीम को प्रोसेस करने के लिए ffmpeg बताता है ( 0:0वीडियो स्ट्रीम है, 0:1फाइल का पहला ऑडियो स्ट्रीम है)। यह दो चीजें करता है, अतिरिक्त ऑडियो स्ट्रीम को स्ट्रिप्स करता है, आमतौर पर पहली ऑडियो स्ट्रीम अंग्रेजी होती है लेकिन हमेशा नहीं। अन्य धाराएं जैसे कि एम्बेडेड उपशीर्षक फ़ाइल आकार को कम कर रहे हैं। यह एक वैकल्पिक स्ट्रिंग भी है। आप ffprobeफ़ाइल में उपलब्ध स्ट्रीम देखने के लिए उपयोग कर सकते हैं । -mapवैकल्पिक है और कमांड से खारिज किया जा सकता है।

    • -vcodec libx264 यह ffmpeg को H.264 आउटपुट को एनकोड करने के लिए कहता है

    • "$i.ts" आउटपुट टेट्स प्रारूप बचाता है, यह उपयोगी है ताकि आपके स्रोत फ़ाइलों को अधिलेखित न किया जाए।

  • mv "$i.ts" "$i.mpg"उसी निर्देशिका में फ़ाइल एक्सटेंशन को MPG में रूपांतरित करता है। इसे अपनी पसंद के किसी भी डायरेक्टरी में भेजने के लिए सेट किया जा सकता है।

  • sleep 3 - प्रक्रिया को अगली फ़ाइल को कतार में रखने के लिए ffmpeg का समय देने की अनुमति देता है


3
अति उत्कृष्ट! अब हम प्रश्न के नीचे टिप्पणियों को हटा सकते हैं। मैं कहूंगा कि sleep 3अनावश्यक (लेकिन लूप को समाप्त करने के लिए संभव है), और INPUT=$1जब से आप इसे एक इंटरैक्टिव शेल में सीधे चला रहे हैं, तब तक यह अर्थहीन है।
मूरू

11
पुन: एन्कोडिंग के बजाय ऑडियो को कॉपी करने वाली स्ट्रीम पर विचार करें -c:a copy। इसके अलावा, 0:0हमेशा वीडियो को संदर्भित नहीं कर सकते हैं, और 0:1हमेशा ऑडियो को संदर्भित नहीं कर सकते हैं। आप संभावित मुद्दों से बचने के लिए एक स्ट्रीम स्पेसिफ़ायर का उपयोग कर सकते हैं: -map 0:v -map 0:aयदि आप इनपुट 0 से सभी वीडियो और ऑडियो स्ट्रीम चाहते हैं, या -map 0:v:0 -map 0:a:0यदि आप इनपुट से केवल पहला वीडियो और ऑडियो स्ट्रीम चाहते हैं। 0. यदि आप केवल अंग्रेज़ी ऑडियो स्ट्रीम चाहते हैं: -map 0:m:language:eng(यह मानते हुए लेबल है)।
llogan

1
@LordNeckbeard मैं आपको एक पूर्ण उत्तर लिखने के लिए वोट करूँगा।
20

1
@Fran उस टिप्पणी पर बहुत सारे उभार नहीं थे। मैंने सरल, कम त्रुटि प्रवण और अधिक कुशल विधियों का उपयोग करके एक उत्तर जोड़ा ।
लल्गन

1
मैं पूरी तरह से बस के साथ जाना था ffmpeg -i $INPUT -vcodec h264 -acodec copy $OUTPUT। कुछ ऐसा जो मैं रोज़ इस्तेमाल करता हूँ और वास्तव में व्यर्थ झंडे के उस बैराज के विपरीत याद कर सकता हूँ जो हर ffmpeg जवाब के लिए इतना बदनाम है।
बेन सिनक्लेयर

20

H.265 का H.264 में बैच रूपांतरण

ये उदाहरण हाल के लिए लिखे गए थे ffmpeg। अपने आप को कुछ परेशानी से बचाएं और हाल का संस्करण डाउनलोड करें । फिर डाल ffmpegमें द्विआधारी ~/binया/usr/local/bin (आप तो लॉग आउट में प्रवेश करें यह ध्यान दिया जाने के लिए हो सकता है)।

Matroska उत्पादन

mkdir h264vids
for f in *.mp4; do ffmpeg -i "$f" -map 0 -c copy -c:v libx264 -crf 23 -preset medium h264vids/"${f%.*}.mkv"; done
  • यह उदाहरण एक निर्देशिका नाम का आउटपुट देगा h264vids

  • यह उदाहरण मानता है कि आपके इनपुट हैं .mp4। यदि नहीं, .mp4तो उदाहरण को अपनी इनपुट फ़ाइल प्रकार में उदाहरण में बदलें , या केवल *अपने द्वारा लालची का उपयोग करें ।

  • -crfगुणवत्ता और -presetएन्कोडिंग गति / दक्षता के लिए समायोजित करें । या बस इन विकल्पों को हटा दें और उन चूक का उपयोग करें जो काफी अच्छे हैं और अधिकांश के लिए पर्याप्त होना चाहिए (उदाहरण इन विकल्पों के लिए डिफ़ॉल्ट मान का उपयोग कर रहा है)। इन विकल्पों पर अधिक जानकारी के लिए FFmpeg Wiki: H.264 देखें ।

MP4 आउटपुट

यह एक और अधिक जटिल है। यह सशर्त एन्कोडिंग प्रदर्शन करेगा यदि इनपुट ऑडियो AAC है या नहीं। यदि इनपुट ऑडियो AAC है तो ऑडियो स्ट्रीम कॉपी (पुन: muxed) हो जाएगा और अनावश्यक री-एन्कोडिंग से बचा जाता है। यदि इनपुट ऑडियो AAC नहीं है, तो यह AAC को फिर से एनकोड किया जाएगा।

यहां एक सरल स्क्रिप्ट प्रदर्शित की गई है कि यह कैसे उपयोग करना है ffprobeऔर ffmpeg। कॉपी करें और इसे कन्वर्ट करने के लिए अपने वीडियो युक्त निर्देशिका में सहेजें, इसे अनुमति के साथ निष्पादित करें chmod +x yourscriptname, फिर इसे साथ चलाएँ ./yourscriptname

#!/bin/bash

mkdir h264vids

for f in *.mkv
do
  audioformat=$(ffprobe -loglevel error -select_streams a:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")
  if [ "$audioformat" = "aac" ]; then
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a copy -movflags +faststart h264vids/"${f%.*}.mp4"
  else
    ffmpeg -i "$f" -c:v libx264 -crf 23 -preset medium -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
  fi
done
  • यह उदाहरण एक निर्देशिका नाम का आउटपुट देगा h264vids

  • यह उदाहरण मानता है कि आपके इनपुट हैं .mkv। यदि नहीं, .mkvतो उदाहरण को अपनी इनपुट फ़ाइल प्रकार में उदाहरण में बदलें , या केवल *अपने द्वारा लालची का उपयोग करें ।

  • के बारे में ऊपर नोट देखें -crfऔर -preset

  • आप ctrl+ के साथ एन्कोडिंग को रोक सकते हैं zऔर फिर से शुरू कर सकते हैं fg


0

पिछले जवाबों को ध्यान में रखते हुए, मैं निम्नलिखित के साथ आया:

for file in *265.mkv; do nice -n19 ffmpeg -i $file -c copy -c:v libx264 ${file/%265.mkv/264.mkv}; done

यह मानता है, कि फाइलों में हमेशा एक नाम होता है 265.mkv। इसे समाप्त करने के साथ बदल दिया जाएगा 264.mkv

यदि आपका फ़ाइल नामकरण अलग है, तो आपको उसके अनुसार कमांड को अनुकूलित करने की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.